簡體   English   中英

用2d數組索引3d numpy數組

[英]Indexing of 3d numpy arrays with 2d arrays

我正在嘗試從3d numpy數組中提取值。 目前,我可以執行以下操作:

newmesh.shape
(40,40,40)

newmesh[2,5,6]
6

但是,如果嘗試使用數組對它進行索引,則結果將不符合預期。

newmesh[np.array([2,5,6])].shape
(3, 42, 42)

我試過使用np.take,但是會產生以下情況;

np.take(newmesh,np.array([2,5,6]))
[-1 -1 -1]

任何想法為什么會這樣? 我的目標是輸入一個(n,3)數組,其中每行對應一個newmesh值,即輸入一個(n,3)數組將返回長度為n的1d數組。

使用idx作為(n,3)索引數組,使用linear-indexing一種方法是使用np.ravel_multi_index

np.take(newmesh,np.ravel_multi_index(idx.T,newmesh.shape))

具有元組形成的方法看起來像這樣-

newmesh[tuple(idx.T)]

如果只有三個維度,您甚至可以使用柱狀切片來索引每個維度,如下所示-

newmesh[idx[:,0],idx[:,1],idx[:,2]]

運行時測試如果有興趣查看與列出的方法相關的性能數字,這是一個快速的運行時測試-

In [18]: newmesh = np.random.rand(40,40,40)

In [19]: idx = np.random.randint(0,40,(1000,3))

In [20]: %timeit np.take(newmesh,np.ravel_multi_index(idx.T,newmesh.shape))
10000 loops, best of 3: 22.5 µs per loop

In [21]: %timeit newmesh[tuple(idx.T)]
10000 loops, best of 3: 20.9 µs per loop

In [22]: %timeit newmesh[idx[:,0],idx[:,1],idx[:,2]]
100000 loops, best of 3: 17.2 µs per loop

暫無
暫無

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

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