我正在寻找一种在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])
。
答案 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])
就效率和在任意尺寸轴上工作的能力而言,到目前为止,这似乎仍是最佳解决方案......