Python 带阵列的Numpy-ndarray切片

Python 带阵列的Numpy-ndarray切片,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,在尝试使用多个切片阵列沿不同维度切片数据阵列时,我很难理解numpy广播错误背后的原因。 我试图使用索引数组选取来沿第一和第二维度切片数据ndarray(100306481),例如np.arange(2306,3)和布尔数组mask,其中mask.shape是(481),其中361个元素是True data[:,picks,mask]返回 索引器错误:形状不匹配:无法广播索引数组 连同形状(102,)(361,) 但是,data[:,:,mask],data[:,picks,:],和data[:

在尝试使用多个切片阵列沿不同维度切片数据阵列时,我很难理解numpy广播错误背后的原因。 我试图使用索引数组
选取
来沿第一和第二维度切片
数据
ndarray(100306481),例如np.arange(2306,3)和布尔数组
mask
,其中
mask.shape
是(481),其中361个元素是
True

data[:,picks,mask]
返回

索引器错误:形状不匹配:无法广播索引数组 连同形状(102,)(361,)

但是,
data[:,:,mask]
data[:,picks,:]
,和
data[:,:10,mask]
工作正常

在这种情况下,广播是如何工作的?什么是蟒蛇式的方法

所以

data[:, :, mask]  => (100, 306, 361) 
data[:, :10, mask] => (100, 10, 361)
data[:, picks, :] => (100, 102, 481)
如果
选择
有(361,)个元素,则

data[:, picks, mask] => (100, 361)  # I think :)
想想
picks
匹配
np.where(mask)

但是要在单独的维度中建立索引,
选择必须是列向量,因此(102,1)与(1361)一起广播以产生(102361)选择

data[:, picks[:,None], mask] => (100, 102, 361) # again I need to test
因此,创建一些测试阵列:

In [253]: data=np.ones((100,306,481))
In [254]: picks=np.arange(2,306,3)
In [255]: mask=np.zeros(481,bool)
In [256]: mask[:361]=True
In [257]: data[:, picks[:,None],mask].shape
Out[257]: (100, 102, 361)
可以用一片来代替阿拉伯菜

In [259]: data[:, 2::3, mask].shape
Out[259]: (100, 102, 361)
ix
在这种情况下很方便

In [268]: I,J=np.ix_(picks,mask)
In [269]: I.shape
Out[269]: (102, 1)
In [270]: J.shape
Out[270]: (1, 361)
In [271]: data[:,I,J].shape
Out[271]: (100, 102, 361)

如果您想要形状的切片
(100,len(picks),len(mask))
,您可以使用
数据[:,picks[:,np.newaxis],mask]
。您不能广播形状为
(m,)
(n,)
的数组,但可以广播形状为
(m,1)
(n,)
的数组。您可能还需要检查函数
np.ix
。上述内容相当于
数据[np.ix(arange(100),picks,mask)]