首页 > 解决方案 > Python中多维数组的非连续切片

问题描述

我正在尝试对这样的多维数组执行非连续切片(Matlab peudo 代码)

 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: shape mismatch: indexing arrays could not be broadcast...

应该注意的是,每次切片一维效果很好!

标签: pythonmatlabnumpy

解决方案


numpy中,如果你使用多个花式索引(即array)同时索引同一个数组的不同维度,它们必须广播。这样做的目的是使索引可以更强大。对于您的情况,解决问题的最简单方法是索引两次:

B[:, :, [0,2]] [..., [1,3,5]]

where...代表尽可能多:的。

以这种方式索引两次会产生一些额外的数据移动时间。如果您只想索引一次,请确保它们广播(即在不同维度上放置精美的索引):

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)


推荐阅读