Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何测试numpy中的所有行是否相等_Python_Arrays_Numpy - Fatal编程技术网

Python 如何测试numpy中的所有行是否相等

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

在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)])
>>> 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()