我有一个4-D数组,我需要沿着给定的维度处理该数组中的所有1-D向量。这很好用:

    def myfun(arr4d,selected_dim):#selected_dim只能是2或3
        打印arr4d.shape#(2,5,10,10)
        对于我在xrange(arr4d.shape [0]):
            对于xrange(arr4d.shape [1])中的j:
                对于xrange(arr4d.shape [selected_dim])中的k:
                    如果selected_dim == 2:
                        arr = arr4d [i,j,k ,:]
                    elif selected_dim == 3:
                        arr = arr4d [i,j,:,k]
                    do_something(arr)#arr为一维,有10个项目


...但是我相信有某种方法可以避免嵌套的“ if”部分,也许还可以提高效率?像在循环之前创建此数组的其他视图,然后遍历这些视图一样吗?

最佳答案

一种常见的处理方法是使用np.rollaxis

def myfun(arr4d, selected_dim):  # selected_dim can only be 2 or 3
    arr4d = np.rollaxis(arr4d, selected_dim)
    print arr4d.shape   # (10, 2, 5, 10)
    for i in xrange(arr4d.shape[1]):
        for j in xrange(arr4d.shape[2]):
            for k in xrange(arr4d.shape[0]):
                arr=arr4d[k, i, j, :]
                do_something(arr)  # arr is 1-D and has 10 items


请注意,np.rollaxis应该返回一个视图,因此它实际上不会复制该数组。

09-30 00:19