找出numpy数组列表相等的最快方法是什么?

时间:2016-05-17 04:57:29

标签: image numpy

我有一个numpy数组列表,每个数组来自一个图像,因此它们是三维的(高度,宽度,通道)。我需要知道哪些(r,w,c)点相等。

编辑:更重要的是,我试图找出这些图片的不同之处。如果有更好的方法,那也很好。

1 个答案:

答案 0 :(得分:1)

这是你想要做的事情吗?

定义两个3d'图像' (为方便起见):

In [417]: img1=np.zeros((4,5,3),int); img2=np.zeros((4,5,3),int)

In [418]: img1[1:3,1:4,:]=[1,0,2]  # different 'color' in the middle    
In [419]: img2[1:3,1:4,:]=[2,1,0]

In [421]: img1!=img2
Out[421]: 
array([[[False, False, False],
        [False, False, False],
        [False, False, False],
        [False, False, False],
        [False, False, False]],

       [[False, False, False],
        [ True,  True,  True],
        ...,
        [False, False, False]]], dtype=bool)

如果我们只是对它们不同的点而不是颜色感兴趣,我们可以应用allany(我可以让您对其进行排序):

In [422]: (img1!=img2).all(axis=2)
Out[422]: 
array([[False, False, False, False, False],
       [False,  True,  True,  True, False],
       [False,  True,  True,  True, False],
       [False, False, False, False, False]], dtype=bool)

并使用where(或nonzero)查找这些点的索引。

In [423]: np.where((img1!=img2).all(axis=2))
Out[423]: 
(array([1, 1, 1, 2, 2, 2], dtype=int32),
 array([1, 2, 3, 1, 2, 3], dtype=int32))

对于多张图片,我们可以堆叠'他们,并做同样的平等测试

In [429]: imgs=np.array([img1,img2])  # 4d (2, 4, 5, 3)

In [430]: (imgs==imgs[0,...]).all(axis=0).all(axis=-1)
Out[430]: 
array([[ True,  True,  True,  True,  True],
       [ True, False, False, False,  True],
       [ True, False, False, False,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

我再次关注如何跨多个维度进行比较。