2012-05-14 4 views
131

두 numpy 배열을 평등하게 비교하는 가장 간단한 방법은 무엇입니까? (등호는 다음과 같이 정의됩니다. 모든 인덱스 i에 대해 A = B iff i : A[i] == B[i])?두 numpy 배열을 같음, 요소별로 비교하기

간단히 == 사용하여 나에게 부울 배열을 제공합니다 : 나는 배열이 동일한 경우이 배열의 요소를 결정하는 and에있는

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

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

이 수행을하거나 비교하는 간단한 방법은 무엇입니까?

답변

197
(A==B).all() 

배열의 모든 값 (A == B)이 참이면 테스트하십시오.

편집 주목해야한다

(dbaupp의 대답과 yoavram의 주석에서) :

  • 이 솔루션은 특별한 경우에 이상한 행동을 할 수 있습니다 : 하나 A 또는 B가 비어있는 경우 다른 요소에는 단일 요소가 들어 있으면 True을 반환합니다. 어떤 이유로 든 A==Ball 연산자가 True을 반환하는 빈 배열을 반환합니다.
  • 또 다른 위험은 AB이 같은 모양을 가지지 않고 브로드 캐스팅 할 수없는 경우입니다. 그러면이 방법을 사용하면 오류가 발생할 수 있습니다.

    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 
    
    : 전문 기능 중 하나를 사용 결론적으로

, 나는 제안 된 솔루션은 내가 생각하지만, 당신은 의심의 여지에 대한 AB 모양을하거나 안전하려면, 표준이다

+7

당신은 거의 항상'np.array_equal' IME를 원하는 :

(A==B).all() 다음과 같은 코드로 거의 작동합니다. '(A == B) .all()'A와 B의 길이가 다른 경우 ** 충돌합니다 **. 1.10 기준으로,이 경우에는 [=== 지원 중단 경고가 나타납니다.] (https://github.com/numpy/numpy/commit/6bf0e419dc79ea6815557c57b7e9bb504ba20543). –

+0

당신은 좋은 지적을 가지고 있지만 IME 나는 보통 손 전에 A와 B의 모양을 알고 있습니다. 나는 그것이 상황에 따라 다르며, 나는 추측한다. –

64

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

( timeit 일부 빠른 테스트는 (A==B).all() 방법은 완전히 새로운 배열을 할당하는 주어, 조금 특이한되는 가장 빠른임을 나타냅니다. 보이지만)

+10

비교 어레이 중 하나가 비어 있으면'(A == B) .all()'으로 잘못된 답을 얻을 것입니다. 예를 들어'(np.array ([1]) == np.array()]. ​​all()'을 호출하면'True'가되고'np.array_equal (np.array ([1]), np.array ([]))'False'를 나타냅니다 – yoavram

+1

방금이 성능 차이를 발견했습니다. '(a == b) .all()'이 여전히 np.array_equal (a, b) (단일 요소를 체크하고 빠져 나올 수있는 것)보다 빠르다는 것은 이상한 일입니다. . –

+0

'np.array_equal'은'lists of arrays'와'dicts of arrays'에서도 작동합니다. 이는 성능 저하의 원인이 될 수 있습니다. – TheEspinosa

11

는 이제 사용하여 성능을 측정하자 다음 코드 조각.

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와 방법은 빠른 == 연산자의 조합과 전체() 방법보다과 의한 것으로 보인다 numpy 메소드를 비교하는 것 가장 빠른 하나는 numpy.array_equal 메소드 인 것 같습니다.

+0

실험 정확도를 높이려면 컴파일하는 데 더 많은 시간이 걸리는 더 큰 배열 크기를 사용해야합니다. –

3

두 개의 배열이 동일한 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 

그래서 거의 동일

는, 필요 속도에 대해 이야기 없습니다.

x = [1,2,3] 
y = [1,2,3] 
print all([True if x[i]==y[i] else False for i in range(len(x))]) 
> True 
관련 문제