具有任意大小轴的三维阵列中的元素相等

时间:2016-06-03 13:05:14

标签: python numpy equality

我正在寻找一种在3D或N-D阵列中找到元素相等的有效方法,例如,在图像的RGB像素上找到相等的值。一些测试数据:

a = numpy.arange(100).reshape((10,10))
b = a.copy()
c = a.copy()
b[5,5] = 1
c[6,6] = 100
d = numpy.array([a,b,c])

我可以想到三个选项,第一个选项不能更好地概括为更多维度:

equal_mask = (d[0] == d[1]) & (d[0] == d[2])

equal_mask = d.min(axis=0) == d.max(axis=0)

或者,或许更好:

equal_mask = numpy.logical_and.reduce(d == d[0])

是否有更有效的解决方案?

编辑:我应该澄清,我并不是指第一轴上具有不同长度的n-D,3-D,例如d = numpy.array([a,b,c,a,b,c])

3 个答案:

答案 0 :(得分:1)

也许这一个:

np.logical_and(*(d[0,:]==d[1:,:]))

答案 1 :(得分:1)

这是nD数组个案的方法,用于查找沿第一轴的所有0'差异 -

(np.diff(d,axis=0)==0).all(0)

运行样本以验证结果 -

In [46]: d = np.random.randint(0,9,(3,3,5,2,3,4,2))

In [47]: out = (np.diff(d,axis=0)==0).all(0)

In [48]: np.allclose(out,(d[0] == d[1]) & (d[0] == d[2]))
Out[48]: True

事实证明,此方法似乎比问题中列出的基于numpy.logical_and.reduce的方法慢。因此,在这一点上看起来像是坚持下去可能就是这样。

答案 2 :(得分:1)

Divakar和Beauvel上校的解决方案都暗示我可以跳过支票d[0] == d[0]来提高解决方案的速度{/ 1}:

numpy.logical_and.reduce(d[1:] == d[0])

就效率和在任意尺寸轴上工作的能力而言,到目前为止,这似乎仍是最佳解决方案......