Python 如何测试numpy中的所有行是否相等
在numpy中,是否有一种很好的惯用方法来测试2d数组中的所有行是否相等 我可以做类似的事情Python 如何测试numpy中的所有行是否相等,python,arrays,numpy,Python,Arrays,Numpy,在numpy中,是否有一种很好的惯用方法来测试2d数组中的所有行是否相等 我可以做类似的事情 np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))]) 这似乎混合了python列表和numpy数组,这很难看,而且可能也很慢 是否有更好/更整洁的方法?只要检查数组中唯一项的数字是否为1: >>> arr = np.array([[1]*10 for _ in xrange(5)]) >>> l
np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
这似乎混合了python列表和numpy数组,这很难看,而且可能也很慢
是否有更好/更整洁的方法?只要检查数组中唯一项的数字是否为1:
>>> arr = np.array([[1]*10 for _ in xrange(5)])
>>> len(np.unique(arr)) == 1
True
受联合国大学启发的解决方案:
代码的一个问题是,在应用np.all()
之前,首先要创建一个完整的列表。由于在您的版本中没有发生短路,因此,如果使用Python的all()
和生成器表达式,则会更好:
时间比较:
>>> M = arr = np.array([[3]*100] + [[2]*100 for _ in xrange(1000)])
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1))
1000 loops, best of 3: 272 µs per loop
>>> %timeit (np.diff(M, axis=0) == 0).all()
1000 loops, best of 3: 596 µs per loop
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
100 loops, best of 3: 10.6 ms per loop
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M)))
100000 loops, best of 3: 11.3 µs per loop
>>> M = arr = np.array([[2]*100 for _ in xrange(1000)])
>>> %timeit np.all(np.all(arr == arr[0,:], axis = 1))
1000 loops, best of 3: 330 µs per loop
>>> %timeit (np.diff(M, axis=0) == 0).all()
1000 loops, best of 3: 594 µs per loop
>>> %timeit np.all([np.array_equal(M[0], M[i]) for i in xrange(1,len(M))])
100 loops, best of 3: 9.51 ms per loop
>>> %timeit all(np.array_equal(M[0], M[i]) for i in xrange(1,len(M)))
100 loops, best of 3: 9.44 ms per loop
一种方法是检查数组
arr
的每一行是否等于其第一行arr[0]
:
(arr == arr[0]).all()
对于整数值,使用相等=
是可以的,但是如果arr
包含浮点值,您可以使用它来检查给定公差内的相等性:
np.isclose(a, a[0]).all()
如果您的数组包含NaN
,并且希望避免棘手的NaN!=NaN
问题,您可以将此方法与np结合使用。isnan:
(np.isclose(a, a[0]) | np.isnan(a)).all()
值得一提的是,该方法不适用于多维数组 例如:对于三维方形图像张量
img
[256,256,3],我们需要检查图像中是否有相同的RGB[256,256]层。
在这种情况下,我们需要使用
(img==img[:,:,0,np.newaxis]).all()
因为simple
img[:,:,0]
给了我们[256,256],但我们需要[256,256,1]通过层进行广播。我认为这是最快的方法。谢谢。检查相等,而不是差的0相等,可能会快一点。那么(np.diff(b,1,1)==0)。all()
@Jaime-谢谢你的建议,我已经将它编辑到了答案中。现在有np.allclose
。我认为ajcr的答案更快@user2179021在我的系统上花费了650µs
,因此仍然比我的第二个答案慢。同意-第二个方法在我的系统上也比我的方法快。你认为有类似的快速方法来判断所有行是否不同吗?第一个方法实际上是检查数组的所有项是否相同,如果所有行都是相同的,则不是。。。尝试使用np.array([[1,2,3],[1,2,3]])
。正如我所说的,这确实需要一个适当的解决方案,它不会创建一个像原始数组那样大的临时数组(这里和那里的答案都是这样)。我会张贴一个答案,一旦我做了补充numpy。
(np.isclose(a, a[0]) | np.isnan(a)).all()