요소 별 동일성을 위해 두 개의 NumPy 배열 비교


252

두 NumPy 배열이 같은지 비교하는 가장 간단한 방법은 무엇입니까 A[i] == B[i]?

간단히 사용 ==하면 부울 배열이 제공됩니다.

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

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

and배열이 같은지 또는 비교할 수있는 더 간단한 방법이 있는지 확인하려면이 배열의 요소에 있어야 합니까?

답변:


380
(A==B).all()

배열의 모든 값 (A == B)이 True인지 테스트합니다.

참고 : 아마도 A와 B 모양을 테스트하고 싶을 수도 있습니다. A.shape == B.shape

특수 사례 및 대안 (dbaupp의 답변 및 yoavram의 의견)

다음 사항에 유의하십시오.

  • 이 솔루션은 특정 경우에 이상한 동작을 가질 수 있습니다. A또는 B비어 있거나 다른 요소에 단일 요소가 포함되어 있으면를 반환 True합니다. 어떤 이유로 든 비교 A==B는 빈 배열을 반환하며, all연산자는를 반환합니다 True.
  • 경우에 또 다른 위험이 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

26
당신은 거의 항상 np.array_equalIME를 원합니다 . (A==B).all()것이다 A와 B는 서로 다른 길이있을 경우 충돌 . numpy 1.10부터 ==는이 경우 지원 중단 경고를 발생 시킵니다.
Wilfred Hughes

당신은 좋은 지적을 가지고 있지만, 경우에 따라 나는 일반적으로 값보다 먼저 직접 테스트하는 것을 선호하는 모양에 의문이 있습니다. 그런 다음 다른 값을 갖는 것과 완전히 다른 의미를 갖는 모양에 오차가 분명히 있습니다. 그러나 이것은 아마도 각각의 유스 케이스에 달려 있습니다
Juh_

2
또 다른 위험은 배열에 nan이 포함 된 경우입니다. 이 경우 nan! = nan
Vincenzooo

1
그것을 지적하는 것이 좋습니다. 그러나 나는 이것이 nan!=nan암시 하기 때문에 논리적이라고 생각 합니다 array(nan)!=array(nan).
Juh_

이 동작을 이해하지 못합니다. 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반환 거짓
덱스

91

(A==B).all()솔루션은 매우 깔끔하지만이 작업에는 몇 가지 기본 제공 기능이 있습니다. 즉 array_equal, allclosearray_equiv.

(단, 몇 가지 빠른 테스트를 수행 timeit하면 (A==B).all()메서드가 가장 빠르며 완전히 새로운 배열을 할당해야하기 때문에 조금 독특합니다.)


15
비교 된 배열 중 하나가 비어 있으면으로 잘못 대답한다는 점을 제외하고는 맞습니다 (A==B).all(). 예를 들어, try : (np.array([1])==np.array([])).all(), Truenp.array_equal(np.array([1]), np.array([]))False
give

1
이 성능 차이도 발견했습니다. 완전히 다른 2 개의 배열이 (a==b).all()있으면 여전히 np.array_equal(a, b)단일 요소를 확인하고 종료 할 수있는 것보다 빠르기 때문에 이상 합니다.
Aidan Kane

np.array_equal또한 작동 lists of arrays하고 dicts of arrays. 성능이 저하 될 수 있습니다.
Bernhard

함수에 대해 감사드립니다 . 수치 계산에 allclose필요한 것입니다 . 공차 내에서 벡터의 동등성을 비교합니다 . :)
loved.by.Jesus

참고하십시오 np.array_equiv([1,1,1], 1) is True. 이 때문이다 그들이 어느 동일한 형상이다 형상 일관된 방법, 또는 하나 개의 입력 어레이는 다른 하나와 동일한 형상을 만들기 위해 방송 될 수있다.
EliadL

13

다음 코드를 사용하여 성능을 측정 해 봅시다.

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 메소드 인 것 같습니다 .


4
실험 정확도를 높이려면 컴파일하는 데 1 초 이상 걸리는 더 큰 배열 크기를 사용해야합니다.
Vikhyat Agarwal

비교 순서가 변경 될 때도 재현됩니까? 또는 매번 무작위로 A와 B를 다시 초기화합니까? 이 차이는 A 및 B 셀의 메모리 캐싱에서도 설명 될 수 있습니다.
또는 Groman

3
이 타이밍 사이에는 의미있는 차이가 없습니다.
토마 세

13

두 배열이 동일 할 수 있는지 확인하려면 shapeelements사용한다 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

5

일반적으로 두 배열에는 작은 숫자 오류가 있습니다.

numpy.allclose(A,B)대신을 사용할 수 있습니다 (A==B).all(). 부울 True / False를 반환합니다.


0

이제 사용하십시오 np.array_equal. 설명서에서 :

np.array_equal([1, 2], [1, 2])
True
np.array_equal(np.array([1, 2]), np.array([1, 2]))
True
np.array_equal([1, 2], [1, 2, 3])
False
np.array_equal([1, 2], [1, 4])
False
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.