比较两个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在特定的情况下可能会有奇怪的行为:如果AB是空的而另一个包含单个元素,那么它返回True 。 出于某种原因,比较A==B返回一个空数组,为此all运算符都返回True
  • 另一个风险是,如果AB不具有相同的形状,并且不能广播,那么这种方法会产生错误。

总之,我认为我提出的解决scheme是标准解决scheme,但是如果您对AB形状有疑问或者只是想要安全一些,请使用以下特殊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_equalallclosearray_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方法。