Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多维数组中选择一些维度_Python_Arrays_Multidimensional Array_Matrix_Numpy - Fatal编程技术网

Python 从多维数组中选择一些维度

Python 从多维数组中选择一些维度,python,arrays,multidimensional-array,matrix,numpy,Python,Arrays,Multidimensional Array,Matrix,Numpy,我有一个4-D数组,我需要处理这个数组中沿着给定维度的所有1-D向量。这很有效: def myfun(arr4d,选定尺寸):#选定尺寸只能为2或3 打印arr4d.shape#(2,5,10,10) 对于x范围内的i(arr4d.形状[0]): 对于X范围内的j(arr4d.形状[1]): 对于X范围内的k(arr4d.形状[选定尺寸]: 如果选择_dim==2: arr=arr4d[i,j,k,:] elif selected_dim==3: arr=arr4d[i,j,:,k] dou_s

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

def myfun(arr4d,选定尺寸):#选定尺寸只能为2或3 打印arr4d.shape#(2,5,10,10) 对于x范围内的i(arr4d.形状[0]): 对于X范围内的j(arr4d.形状[1]): 对于X范围内的k(arr4d.形状[选定尺寸]: 如果选择_dim==2: arr=arr4d[i,j,k,:] elif selected_dim==3: arr=arr4d[i,j,:,k] dou_something(arr)#arr是一维的,有10个项目
…但我相信有一些方法可以避免嵌套的“如果”部分,并且可能更有效?就像在循环之前创建此数组的其他视图,然后在这些视图中迭代一样?

处理此问题的一种常见方法是使用
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
应该返回一个视图,这样它就不会实际复制数组。

您是说嵌套的for循环是您想要避免的吗?我只看到一个简单的if…elif构造。我的意思是避免嵌套的
if
,或者,避免三个
for
。根据@BiRico的回答,
numpy.rollaxis
是摆脱困扰我的“可变维度”问题的一种方法。谢谢!是否可以使用
np.take
和适当的
,以及可能的其他参数来达到类似的效果?我没能做到,但看起来
take
也很有用。