Numpy ndarray切片与数组

时间:2017-05-02 00:18:19

标签: python arrays numpy indexing

当我尝试使用多个切片阵列沿着不同的维度切割ndarray时,我无法理解numpy广播错误背后的原因。 我试图使用索引数组data沿着第一维和第二维对picks ndarray(100,306,481)进行切片,例如,np.arange(2,306,3)和布尔数组{ {1}},其中mask为(481),其中361个元素为mask.shape

True返回

  

IndexError:形状不匹配:无法广播索引数组   与形状(102,)(361,)

一起

但是data[:, picks, mask]data[:, :, mask]data[:, picks, :]按预期工作。

在这种情况下,广播如何运作?什么是pythonic方式这样做?

1 个答案:

答案 0 :(得分:2)

所以

data[:, :, mask]  => (100, 306, 361) 
data[:, :10, mask] => (100, 10, 361)
data[:, picks, :] => (100, 102, 481)

如果picks有(361,)元素,那么

data[:, picks, mask] => (100, 361)  # I think :)

考虑picks匹配np.where(mask)

但要在单独的维度中进行索引,picks必须是列向量,因此(102,1)用(1,361)广播以产生(102,361)选择

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)

可以用切片替换arange

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)