375

2 つの NumPy 配列の等価性を比較する最も簡単な方法は何A[i] == B[i]ですか?

単純に使用==すると、ブール配列が得られます。

 >>> numpy.array([1,1,1]) == numpy.array([1,1,1])

array([ True,  True,  True], dtype=bool)

and配列が等しいかどうかを判断するために、この配列の要素を使用する必要がありますか、または比較する簡単な方法はありますか?

4

8 に答える 8

545
(A==B).all()

配列(A == B)のすべての値がTrueであるかどうかをテストします。

注:AとBの形状もテストしたい場合があります。A.shape == B.shape

特別な場合と代替案(dbauppの回答とyoavramのコメントから)

注意すべきこと:

  • このソリューションは、特定の場合に奇妙な動作をする可能性があります。AまたはBが空で、もう一方が単一の要素を含む場合、それはを返しTrueます。何らかの理由で、比較A==Bによって空の配列が返され、all演算子はその配列を返しますTrue
  • もう1つのリスクは、同じ形状でなく、ブロードキャストできない場合、このアプローチではエラーが発生することですAB

結論として、疑問がAあり、B形を整えている場合、または単に安全になりたい場合は、次のいずれかの特殊な機能を使用してください。

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
于 2012-05-14T09:37:13.133 に答える
15

次のコードを使用してパフォーマンスを測定してみましょう。

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メソッドのようです。

于 2016-02-23T13:42:04.133 に答える