요소별로 동일한 두 NumPy 어레이 비교
동일성을 위해 두 NumPy 어레이를 비교하는 가장 간단한 방법은 무엇입니까(여기서 동일성은 모든 인덱스에 대해 A = B iff:A[i] == B[i]
)?
간단하게 사용==
는 부울 배열을 나타냅니다.
>>> numpy.array([1,1,1]) == numpy.array([1,1,1])
array([ True, True, True], dtype=bool)
꼭 해야 하나요?and
어레이가 동일한지 여부를 판단하기 위해 이 어레이의 요소를 선택합니다.또는 보다 간단한 비교 방법이 있을까요?
(A==B).all()
어레이의 모든 값(A==B)이 True인지 테스트합니다.
참고: 다음과 같이 A 및 B 모양도 테스트할 수 있습니다.A.shape == B.shape
특별한 경우 및 대안 (dbaupp의 답변과 yoavram의 코멘트에서)
주의할 점은 다음과 같습니다.
- 이 솔루션은 특정 상황에서 이상한 동작을 할 수 있습니다.
A
또는B
비어 있고 다른 하나는 단일 요소를 포함하며, 그러면 반환됩니다.True
어떤 이유에서인지, 비교는A==B
빈 배열을 반환합니다.all
연산자가 반환하다True
. - 또 다른 리스크는
A
그리고.B
모양이 동일하지 않고 브로드캐스트할 수 없습니다.이 접근방식은 에러를 발생시킵니다.
결론적으로, 만약 당신이 의구심이 있다면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
그(A==B).all()
솔루션은 매우 깔끔하지만 이 태스크에는 몇 가지 기능이 내장되어 있습니다.즉, 및 입니다.
(단, 몇 가지 간단한 테스트는timeit
의 의미를 나타내고 있는 것 같습니다.(A==B).all()
완전히 새로운 어레이를 할당해야 하기 때문에 방법이 가장 빠릅니다.)
두 어레이가 동일한지 여부를 확인하는 경우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
다음 코드를 사용하여 성능을 측정해 보겠습니다.
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_method가 가장 빠른 것으로 보입니다.
통상, 2개의 어레이에서는 작은 수치 에러가 발생합니다.
하시면 됩니다.numpy.allclose(A,B)
「」가 아닌 「」(A==B).all()
. True/ 진실/거짓말하다
" "를 사용하세요"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
이제 다른 답변과 함께 어설션을 사용할 수 있습니다.
numpy.testing.assert_array_equal(x, y)
'먹다'와 같은 .numpy.testing.assert_almost_equal()
https://numpy.org/doc/stable/reference/generated/numpy.testing.assert_array_equal.html
단지 완성도를 위해.두 어레이를 비교하기 위한 판다 접근법을 추가하겠습니다.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
b = np.arange(0.0, 10.2, 0.12)
ap = pd.DataFrame(a)
bp = pd.DataFrame(b)
ap.equals(bp)
True
참고: R의 벡터, 어레이 또는 데이터 프레임을 비교하는 방법을 찾고 있는 경우.다음 항목만 사용할 수 있습니다.
identical(iris1, iris2)
#[1] TRUE
all.equal(array1, array2)
#> [1] TRUE
언급URL : https://stackoverflow.com/questions/10580676/comparing-two-numpy-arrays-for-equality-element-wise
'source' 카테고리의 다른 글
phpmyadmin : 의존: php-twig (>= 2.9) 단, 2.6.2-2 가 인스톨 됩니다.뭐라고? (0) | 2022.12.08 |
---|---|
IPython 노트북 matplotlib 그림을 인라인으로 만드는 방법 (0) | 2022.12.08 |
Map.clear() vs new Map : 어떤 것이 더 좋을까요? (0) | 2022.12.08 |
나가는 것과 돌아오는 것의 차이는 무엇입니까? (0) | 2022.12.08 |
MySQL "텍스트" 필드에 UTF-8 텍스트가 어느 정도 들어갑니까? (0) | 2022.12.08 |