回答:
(A==B).all()
配列(A == B)のすべての値がTrueかどうかをテストします。
注:次のように、AとBの形状もテストしたい場合があります。 A.shape == B.shape
特別なケースと代替案(dbauppの回答とyoavramのコメントから)
注意すべきこと:
A
またはB
が空で、もう一方が単一の要素を含んでいる場合は、を返しTrue
ます。なんらかの理由で、比較A==B
によって空の配列all
が返され、演算子に対してはその配列が返されますTrue
。A
とB
同じ形状を有していないとbroadcastableではありませんん、このアプローチは、エラーが発生します。結論として、あなたが疑いを抱いているA
、B
または単に安全を望んでいる場合:特別な機能の1つを使用してください:
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
nan!=nan
意味するので、これは論理的だと思いますarray(nan)!=array(nan)
。
import numpy as np
H = 1/np.sqrt(2)*np.array([[1, 1], [1, -1]]) #hadamard matrix
np.array_equal(H.dot(H.T.conj()), np.eye(len(H))) # checking if H is an unitary matrix or not
。Hはユニタリ行列なので、H x H.T.conj
は単位行列です。しかし、np.array_equal
Falseを返します
(A==B).all()
解決策は非常にきれいですが、このタスクのためのいくつかの組み込みの機能があります。すなわちarray_equal
、allclose
そしてarray_equiv
。
(ただし、を使用したいくつかの簡単なテストでtimeit
は、(A==B).all()
メソッドが最も高速であることが示されているようです。まったく新しい配列を割り当てる必要があるため、これは少し変わっています。)
(A==B).all()
。たとえば、(np.array([1])==np.array([])).all()
True
np.array_equal(np.array([1]), np.array([]))
False
(a==b).all()
でも、np.array_equal(a, b)
それは(単一の要素をチェックして終了した可能性がある)よりも高速であるため、これは奇妙です。
np.array_equal
lists of arrays
およびでも動作しdicts of arrays
ます。これがパフォーマンスの低下の原因である可能性があります。
allclose
、それは私が数値計算に必要なものです。許容範囲内のベクトルの同等性を比較します。:)
np.array_equiv([1,1,1], 1) is True
。これは次の理由によります:形状の一貫性とは、それらが同じ形状であること、または1つの入力配列をブロードキャストして他の入力配列と同じ形状を作成できることを意味します。
次のコードを使用してパフォーマンスを測定しましょう。
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メソッドのようです。
あなたは、2つの配列が同じを持っているかどうかを確認したい場合shape
とelements
、あなたが使用する必要がありnp.array_equal
、それはマニュアルに推奨される方法ですと。
パフォーマンスに関しては、最適化の余地があまりないため、同等性チェックが他のテストに勝ることを期待しないでください
comparing two elements
。ちょうどのために、私はまだいくつかのテストを行いました。
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
ほぼ同じなので、速度について話す必要はありません。
(A==B).all()
かなり多くの次のコードスニペットのように振る舞います。
x = [1,2,3]
y = [1,2,3]
print all([x[i]==y[i] for i in range(len(x))])
> True
np.array_equal
IME が必要です。(A==B).all()
ますAとBの長さが異なる場合にクラッシュ。numpy 1.10以降、この場合==は非推奨の警告を出します。