2014-05-22 85 views
4

我希望得到一個主numpy的二維數組A的交叉行的索引,用另一個B.獲取相交numpy的二維數組的行指數

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

B=array([[1, 4], 
     [1, 2], 
     [5, 6], 
     [6, 3]]) 

result=[0,2] 

凡本應返回[0,2 ]基於陣列A的指數。

這怎麼能有效地完成2d陣列​​?

謝謝!

編輯

我已經試過功能:

k[np.in1d(k.view(dtype='i,i').reshape(k.shape[0]),k2.view(dtype='i,i'). 
reshape(k2.shape[0]))] 

Implementation of numpy in1d for 2D arrays?但我得到一個重塑錯誤。我的數據類型是浮點數(有兩位小數)。 此外,我也嘗試過套裝,但表現相當緩慢。

+0

有什麼你試過自己,沒有工作? –

+0

是的,我嘗試了k [np.in1d(k.view(dtype ='i,i')。reshape(k.shape [0]),k2.view(dtype ='i,i')。reshape(k2。形狀[0]))]從http://stackoverflow.com/questions/16210738/numpy-in1d-for-2d-arrays。但我得到一個重塑錯誤。 –

+0

好的,你可以編輯這個問題,這樣每個人都可以清楚地看到它嗎? –

回答

4

最小的變化,你可以得到你的工作方式:

In [15]: A 
Out[15]: 
array([[ 1, 2], 
     [ 3, 4], 
     [ 5, 6], 
     [ 7, 8], 
     [ 9, 10]]) 

In [16]: B 
Out[16]: 
array([[1, 4], 
     [1, 2], 
     [5, 6], 
     [6, 3]]) 

In [17]: np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)) 
Out[17]: array([ True, False, True, False, False], dtype=bool) 

In [18]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1))) 
Out[18]: (array([0, 2], dtype=int64),) 

In [19]: np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0] 
Out[19]: array([0, 2], dtype=int64) 

如果你的數組不是浮動,且都是連續的,那麼下面會更快:

In [21]: dt = np.dtype((np.void, A.dtype.itemsize * A.shape[1])) 

In [22]: np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0] 
Out[22]: array([0, 2], dtype=int64) 

而且一個快速的時機:

In [24]: %timeit np.nonzero(np.in1d(A.view('i,i').reshape(-1), B.view('i,i').reshape(-1)))[0] 
10000 loops, best of 3: 75 µs per loop 

In [25]: %timeit np.nonzero(np.in1d(A.view(dt).reshape(-1), B.view(dt).reshape(-1)))[0] 
10000 loops, best of 3: 29.8 µs per loop 
2

您可以使用np.char.array()對象做使用np.in1d()這種比較:

s1 = np.char.array(A[:,0]) + '-' + np.char.array(A[:,1]) 
s2 = np.char.array(B[:,0]) + '-' + np.char.array(B[:,1]) 

np.where(np.in1d(s1, s2))[0] 
#array([0, 2], dtype=int64) 

注意AB必須是相同的數據類型(intfloat等),這個工作的。

+1

很優雅,適合我! +1 – trdavidson