具有任意大小轴的 3-D 数组中的逐元素相等
Element-wise equality in 3-D array with arbitrarily sized axes
我正在寻找一种在 3D 或 N 维数组中查找元素相等性的有效方法,例如,图像的 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])
。
也许是这个:
np.logical_and(*(d[0,:]==d[1:,:]))
这是 nD
数组情况的一种方法,它沿着第一个轴寻找所有 0'
s 微分 -
(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
的方法慢。所以,在这一点上看起来坚持下去可能是要走的路。
Divakar 和 Colonel Beauvel 的解决方案都暗示我可以通过跳过检查 d[0] == d[0]
:
使我的解决方案更快一些
numpy.logical_and.reduce(d[1:] == d[0])
就效率和在任意大小的轴上工作的能力而言,这似乎仍然是最好的解决方案,到目前为止...
我正在寻找一种在 3D 或 N 维数组中查找元素相等性的有效方法,例如,图像的 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])
。
也许是这个:
np.logical_and(*(d[0,:]==d[1:,:]))
这是 nD
数组情况的一种方法,它沿着第一个轴寻找所有 0'
s 微分 -
(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
的方法慢。所以,在这一点上看起来坚持下去可能是要走的路。
Divakar 和 Colonel Beauvel 的解决方案都暗示我可以通过跳过检查 d[0] == d[0]
:
numpy.logical_and.reduce(d[1:] == d[0])
就效率和在任意大小的轴上工作的能力而言,这似乎仍然是最好的解决方案,到目前为止...