比较两个numpy数组是否相等,element-wise
什么是最简单的方法来比较两个numpy数组的等式(其中相等被定义为:A = B iff所有指数i: A[i] == B[i]
)?
简单地使用==
给了我一个布尔数组:
>>> numpy.array([1,1,1]) == numpy.array([1,1,1]) array([ True, True, True], dtype=bool)
我必须and
这个数组的元素来确定数组是否相等,还是有比较简单的方法?
(A==B).all()
testing数组(A == B)的所有值是否为真。
编辑 (从dbaupp的回答和yoavram的评论)
应该指出的是:
- 这个解决scheme在特定的情况下可能会有奇怪的行为:如果
A
或B
是空的而另一个包含单个元素,那么它返回True
。 出于某种原因,比较A==B
返回一个空数组,为此all
运算符都返回True
。 - 另一个风险是,如果
A
和B
不具有相同的形状,并且不能广播,那么这种方法会产生错误。
总之,我认为我提出的解决scheme是标准解决scheme,但是如果您对A
和B
形状有疑问或者只是想要安全一些,请使用以下特殊function之一:
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
(A==B).all()
解决scheme非常整洁,但是这个任务有一些内置函数。 即array_equal
, allclose
和array_equiv
。
(尽pipe使用timeit
一些快速testing似乎表明(A==B).all()
方法是最快的,这有点奇怪,因为它必须分配一个全新的数组。
让我们通过使用下面的一段代码来衡量性能。
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)
产量
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方法。