2016-10-24 223 views
1

我試圖從一個3d numpy數組中提取值。此刻,我可以執行以下操作:用二維數組對三維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數組。

回答

1

隨着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 
+0

由於這是非常有益的。你明白我爲什麼做錯了嗎? – Jack

+0

@Jack沒有任何逗號,在NumPy數組中,你只能用'newmesh [np.array([2,5,6])]'索引到第一個dim,它會從第一個dim選擇三個elem,一切從昏暗的其餘部分。所以,它本質上是:'newmesh [np.array([2,5,6]),:,:]'。 – Divakar