Comparing two numpy arrays for equality, element-wise
比较两个numpy数组是否相等的最简单方法是什么(其中equality定义为:a=b iff,对于所有索引i:
简单地使用
1 2 3 | >>> numpy.array([1,1,1]) == numpy.array([1,1,1]) array([ True, True, True], dtype=bool) |
我是否必须用
1 | (A==B).all() |
测试数组(a==b)的所有值是否为真。
编辑(来自dbaupp的回答和yoavram的评论)
应注意:
- 在特定情况下,此解决方案可能有一种奇怪的行为:如果
A 或B 为空,而另一个包含单个元素,则返回True 。出于某种原因,比较A==B 返回一个空数组,因此all 运算符返回True 。 - 另一个风险是,如果
A 和B 的形状不相同且不可广播,那么这种方法会产生错误。
总之,我认为我提出的解决方案是标准的,但是如果你对
1 2 3 | np.array_equal(A,B) # test if same shape, same elements values np.array_equiv(A,B) # test if broadcastable shape, same elements values np.allclose(A,B,...) # test if same shape, elements have close enough values |
号
(不过,一些对
让我们用下面的代码来度量性能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import numpy as np import time exec_time0 = [] exec_time1 = [] exec_time2 = [] sizeOfArray = 5000 numOfIterations = 200 for i in xrange(numOfIterations): A = np.random.randint(0,255,(sizeOfArray,sizeOfArray)) B = np.random.randint(0,255,(sizeOfArray,sizeOfArray)) a = time.clock() res = (A==B).all() b = time.clock() exec_time0.append( b - a ) a = time.clock() res = np.array_equal(A,B) b = time.clock() exec_time1.append( b - a ) a = time.clock() res = np.array_equiv(A,B) b = time.clock() exec_time2.append( b - a ) print 'Method: (A==B).all(), ', np.mean(exec_time0) print 'Method: np.array_equal(A,B),', np.mean(exec_time1) print 'Method: np.array_equiv(A,B),', np.mean(exec_time2) |
产量
1 2 3 | Method: (A==B).all(), 0.03031857 Method: np.array_equal(A,B), 0.030025185 Method: np.array_equiv(A,B), 0.030141515 |
。
根据上面的结果,numpy方法似乎比==运算符和all()方法的组合更快,通过比较numpy方法,最快的方法似乎是numpy.array_equal方法。
如果要检查两个数组是否具有相同的
Performance-wise don't expect that any equality check will beat another, as there is not much room to optimize
comparing two elements . Just for the sake, i still did some tests.
号
1 2 3 4 5 6 7 8 9 10 11 12 13 | import numpy as np import timeit A = np.zeros((300, 300, 3)) B = np.zeros((300, 300, 3)) C = np.ones((300, 300, 3)) timeit.timeit(stmt='(A==B).all()', setup='from __main__ import A, B', number=10**5) timeit.timeit(stmt='np.array_equal(A, B)', setup='from __main__ import A, B, np', number=10**5) timeit.timeit(stmt='np.array_equiv(A, B)', setup='from __main__ import A, B, np', number=10**5) > 51.5094 > 52.555 > 52.761 |
差不多,没必要谈论速度。
1 2 3 4 | x = [1,2,3] y = [1,2,3] print all([x[i]==y[i] for i in range(len(x))]) > True |
。