2014-02-10 90 views
2

我有兩個陣列的2D陣列2D陣列訪問,一個是索引對的矩陣,numpy的:具有索引

a = array([[[0,0],[1,1]],[[2,0],[2,1]]], dtype=int) 

而另一個是數據的矩陣,以訪問在這些指數

b = array([[1,2,3],[4,5,6],[7,8,9]]) 

我希望能夠使用a的索引來獲得b的條目。只是做:

>>> b[a] 

不起作用,因爲它給出了在a每個條目B的一排,即

array([[[[1,2,3], 
     [1,2,3]], 

     [[4,5,6], 
     [4,5,6]]], 


     [[[7,8,9], 
     [1,2,3]], 

     [[7,8,9], 
     [4,5,6]]]]) 

當我想用索引對在a最後軸給這兩個指數的b

array([[1,5],[7,8]]) 

是否有這樣做的一個乾淨的方式,或者我需要重塑b和組合的01列以相應的方式?

在我的實際問題a約有500萬條目,而b是100乘100,我想避免循環。

+0

看起來你在'a'附近有一個額外的支架。 a = array([[0,0],[1,1],[2,0],[2,1]],dtype = int)是否工作? – colcarroll

+0

@JLLagrange它應該在那裏。 'a.shape'應該是'(2,2,2)',或者更一般地說,'(n,m,2)'和結果'(n,m,1)'(='(n,m) ')。 – Lucas

回答

2

其實,這個工程:

b[a[:, :, 0],a[:, :, 1]] 

給出array([[1, 5], [7, 8]])

+0

當然可以!謝謝 – Lucas

1

對於這種情況,其工作原理

tmp = a.reshape(-1,2) 
b[tmp[:,0], tmp[:,1]] 
+0

c是tmp吧? – Lucas

+0

是的,對不起。固定 – M4rtini

+0

需要重新形成結果,但是:b.reshape(a.shape [: - 1]) – Lucas

0

的更通用的解決方案中,每當要使用具有任意大尺寸米形狀的指數(N,M)的2D陣列,命名爲INDS,爲了訪問形狀(N,K)的另一二維陣列的元件,命名爲

# array of index offsets to be added to each row of inds 
offset = np.arange(0, inds.size, inds.shape[1]) 

# numpy.take(B, C) "flattens" arrays B and C and selects elements from B based on indices in C 
Result = np.take(B, offset[:,np.newaxis]+inds) 

可以通過使用測試這一點,例如:

B = 1/(np.arange(n*m).reshape(n,-1) + 1) 
inds = np.random.randint(0,B.shape[1],(B.shape[0],B.shape[1]))