Python中多维数组的非连续切片

时间:2018-10-30 21:06:12

标签: python matlab numpy

我正在尝试对像这样的多维数组(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:形状不匹配:无法广播索引数组...

应该注意的是,每次进行一维切片都可以!

1 个答案:

答案 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'))