2015-09-22 81 views
1

假設我有兩個不同閾值的圖像,並且我希望在兩個閾值上找到兩個索引的集合交集,換句話說就是兩個列表中的所有索引。假設尺寸是相等的,所以沒有什麼可擔心的。相交兩個numpy索引數組

img1 = #something 
img2 = #something slightly different 
indexes1 = np.nonzero(img1) 
indexes2 = np.nonzero(img2) 
index_intersection = #??? 

我該如何以易於理解和有效的方式進行操作?

+0

假設'img1'和'img2'的樣本數據並向我們顯示期望的輸出? – Divakar

+0

可能的重複:http://stackoverflow.com/questions/9269681/intersection-of-2d-numpy-ndarrays – AGML

+0

@AGML這個問題是關於幾何(也屬於無限集合)交集,而這一個是關於有限集合交集。類似,但不同! –

回答

2

如果你正在尋找匹配非零XY指數對,您可以使用布爾取與輸入數組的非零口罩之間,然後用np.nonzero,像這樣 -

out = np.nonzero((img1!=0) & (img2!=0)) 

您可以驗證與np.intersect1d這些結果

l_intsct = np.intersect1d(np.nonzero(img1.ravel())[0],np.nonzero(img2.ravel())[0]) 
out = np.unravel_index(l_intsct,img1.shape) 

採樣運行 - - 讓比賽的線性指數從img1img2給了我們第二個方法手頭要解決的問題,像這樣經過

In [127]: img1 
Out[127]: 
array([[3, 2, 3, 1, 0], 
     [3, 1, 1, 2, 2], 
     [0, 2, 3, 2, 1], 
     [0, 0, 0, 4, 2]]) 

In [128]: img2 
Out[128]: 
array([[1, 1, 4, 0, 0], 
     [0, 0, 0, 0, 2], 
     [4, 1, 0, 3, 1], 
     [1, 0, 4, 1, 4]]) 

In [129]: np.nonzero(img1) 
Out[129]: 
(array([0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3]), 
array([0, 1, 2, 3, 0, 1, 2, 3, 4, 1, 2, 3, 4, 3, 4])) 

In [130]: np.nonzero(img2) 
Out[130]: 
(array([0, 0, 0, 1, 2, 2, 2, 2, 3, 3, 3, 3]), 
array([0, 1, 2, 4, 0, 1, 3, 4, 0, 2, 3, 4])) 

In [131]: np.nonzero((img1!=0) & (img2!=0)) 
Out[131]: (array([0, 0, 0, 1, 2, 2, 2, 3, 3]), array([0, 1, 2, 4, 1, 3, 4, 3, 4])) 

In [132]: l_intsct = np.intersect1d(np.nonzero(img1.ravel())[0],np.nonzero(img2.ravel())[0]) 

In [133]: np.unravel_index(l_intsct,img1.shape) 
Out[133]: (array([0, 0, 0, 1, 2, 2, 2, 3, 3]), array([0, 1, 2, 4, 1, 3, 4, 3, 4])) 
+0

有趣!如果(0,0)分別在哪裏? –

+0

@AndrewHundt如果'R1,C1 = np.nonzero(img1)'和'R2,C2 = np.nonzero(img2)',你的意思是(0,0)爲一對'R'和'C',已經出現在列出的樣本中,然後查看輸出:列出的解決方案中的'R,C = np.nonzero((img1!= 0)&(img2!= 0))'給出了該對,對吧?或者你還指什麼? – Divakar

+0

在我的使用案例中,我嘗試了這個命令,它似乎沒有工作。我不知道爲什麼。 –