2016-05-30 130 views
1

我有兩個矩陣(或更好的2D numpy陣列),AB,列數相同(當然,行數,但我只是將兩個矩陣切成兩列),但行數不同。檢查矩陣的每一行是否在另一個矩陣中[Python]

我想檢查A中的每一行是否在B以及B中正確的行索引是什麼。其實,我自己用的是常規的循環,即

for r in range(A.shape[0]): 
    idx=numpy.where(numpy.all(B[:,[0,1]]==A[r,[1,2]],axis=1)) 
    idx=idx[0][0] 

我如果有一些更聰明的方法來做到這一點,不知道使用索引方法,避免循環可能。我知道numpy的in1d,但它只適用於1D陣列。

對於熟悉Matlab的讀者,當'rows'選項被觸發時,我正在尋找ismember()行爲。

+0

有什麼輸出格式? – Divakar

+0

@Divakar所需的輸出,如果可能的話,應該是一個數組(或列表),其中'*'第*行的行索引包含'A'的第*行*行。例如'[1,5,4]'的輸出列表意味着在'B'的第一行中找到'A'的第一行,在'B'的第五行中找到'A'的第二行在'B'的第四行找到第三行'A'。不過,我清楚地知道,在Python中,索引從0開始。 – Alessiox

回答

1

您可以使用使用NumPy broadcasting一個量化的方法,像這樣 -

np.argwhere((B[:,None,[0,1]] == A[:,[1,2]]).all(-1)) 

或者,因爲你面對的只是2元素的行,即保持2D內存有效的方法,可以認爲,像這樣 -

np.argwhere((B[:,None,0] == A[:,1]) & (B[:,None,1] == A[:,2])) 

輸出將是(N,2)形陣列,其中,所述第一列給出我們的B的行索引和的第二列對應於一行中所有元素的匹配。

採樣運行 -

In [154]: A[:,[1,2]] 
Out[154]: 
array([[0, 1], 
     [0, 2], 
     [2, 1], 
     [1, 2], 
     [0, 1]]) 

In [155]: B[:,[0,1]] 
Out[155]: 
array([[0, 1], 
     [2, 2], 
     [1, 2], 
     [0, 2], 
     [2, 1], 
     [2, 1], 
     [1, 0]]) 

In [156]: np.argwhere((B[:,None,[0,1]] == A[:,[1,2]]).all(-1)) 
Out[156]: 
array([[0, 0], 
     [0, 4], 
     [2, 3], 
     [3, 1], 
     [4, 2], 
     [5, 2]]) 
+0

這一個輝煌的解決方案。我會把它放在我的包裏。太糟糕了,對於大型矩陣來說是不切實際的。 – Alessiox

+0

@Alessiox你的大型矩陣有多大? – Divakar

+0

目前我正在研究'A'大約200 MB和'B'大約10MB – Alessiox

相關問題