我正在尝试对像这样的多维数组(Matlab伪代码)进行非定理切片
A = B(:,:,[1,3],[2,4,6]) %A and B are two 4D matrices
但是当我尝试用Python编写此代码时:
A = B[:,:,np.array([0,2]),np.array([1,3,5])] #A and B are two 4D arrays
它给出了一个错误:IndexError:形状不匹配:无法广播索引数组...
应该注意的是,每次进行一维切片都可以!
答案 0 :(得分:2)
在numpy
中,如果您使用多个索引(即array
)来同时索引同一数组的不同维,则它们必须广播。这样做的目的是使索引功能更强大。对于您的情况,解决问题的最简单方法是两次索引:
B[:, :, [0,2]] [..., [1,3,5]]
其中...
代表尽可能多的:
。
以这种方式两次编制索引将产生一些额外的数据移动时间。如果您只想索引一次,请确保它们广播了(即,将奇特的索引放在不同的维度上):
B[:, :, np.array([0,2])[:,None], [1,3,5]]
这将导致一个X by Y by 2 by 3
数组。另一方面,您也可以
B[:, :, [0,2], np.array([1,3,5])[:,None]]
这将导致一个X by Y by 3 by 2
数组。 [1,3,5]
轴位于[0,2]
轴之前。
如果您不需要使用np.array([0,2])
,则不需要使用[0,2]
。只需np.array([0,2])[:,None]
就可以了。
[[0],[2]]
等效于[:,None]
,其中(2,1)
的点是创建额外的尺寸,以使形状变为(2,)
。形状(3,)
和(2,1)
无法广播,而形状(3,)
和(2,3)
可以广播,date('M', strtotime('-1 month'))
。