2015-09-22 79 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

在我的使用案例中,我尝试了这个命令,它似乎没有工作。我不知道为什么。 –