簡體   English   中英

numpy ndarray切片與數組

[英]Numpy ndarray slicing with arrays

當嘗試使用多個切片數組沿單獨的維度切片ndarray時,我無法理解numpy廣播錯誤背后的原因。 我正在嘗試使用索引數組picks例如np.arange(2,306,3)和一個布爾數組mask (其中mask.shape為(481))沿第一和第二維將data ndarray(100,306,481)切片,),其中361個元素為True

data[:, picks, mask]返回

IndexError:形狀不匹配:索引數組不能與形狀(102,)(361,)一起廣播

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

在這種情況下,廣播如何工作? python方法是什么呢?

所以

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM