2017-05-02 192 views
-1

我在嘗試使用多個切片陣列沿不同尺寸切片ndarray時,無法理解numpy廣播錯誤背後的原因。我試圖使用索引數組picks(例如,np.arange(2,306,3))和布爾數組mask沿着第一維和第二維分割(100,306,481),其中mask.shape是(481, )其中361個元素是TrueNumpy ndarray與陣列切片

data[:, picks, mask]回報

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (102,) (361,)

然而data[:, :, mask]data[:, picks, :]data[:, :10, mask]按預期方式工作。

在這種情況下廣播是如何工作的?什麼是這樣做的pythonic方式?

+0

如果你想(100,len(picks),len(mask))',你可以使用'data [:, picks [:, np.newaxis],掩碼]'。你不能廣播具有'(m,)'和'(n,)'形狀的數組,但是可以用'(m,1)'和'(n,)'來完成。 –

+0

您可能還想檢查函數'np.ix_'。上面相當於data [np.ix_(arange(100),picks,mask)]'。 –

回答

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) 

的人氣指數可以用切片來代替

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)