numpy.array 동등성을 주장하는 가장 좋은 방법은 무엇입니까?


103

내 앱에 대해 몇 가지 단위 테스트를하고 싶은데 두 배열을 비교해야합니다. 이후 array.__eq__반환 새로운 배열 (그래서 TestCase.assertEqual실패), 지 어떤지를 주장하는 가장 좋은 방법은 무엇입니까?

현재 나는

self.assertTrue((arr1 == arr2).all())

근데별로 좋아하지 않아


1
예를 들어 True를 산출 할 수 있습니다. 예를 들어 (np.array([1, 1]) == np.array([1])).all()True
M. Bernhardt

self.assertTrue (np.array_equal (array1, array2))
Miszo97

답변:


120

어설 기능에 체크 아웃 numpy.testing, 예를 들어,

assert_array_equal

부동 소수점 배열의 경우 동등성 테스트가 실패 할 수 있으며 assert_almost_equal더 안정적입니다.

최신 정보

몇 가지 버전 전에 얻은 numpy assert_allclose는 절대 및 상대 오류를 모두 지정할 수 있고 근접성 기준으로 소수 반올림이 필요하지 않기 때문에 이제 제가 가장 좋아하는 것입니다.


18
이것은 unittest와 어떻게 상호 작용합니까? 나는 그 문제에 대한 몇 마디가 유용 할 것이라고 생각한다.
Ramon Martinez

나는 unittest를 사용하지 않습니다. 그러나 numpy, scipy 및 statsmodels에서 사용하는 nosetest와 매우 잘 작동합니다. 테스트 함수 또는 메서드 내에서 어설 션을 사용하십시오.
Josef

이것은 두 인수가 모두 numpy 배열인지 확인하지 않습니다. 예를 들어 배열과 목록에서 성공합니다. 테스트를 위해 이것이 실제로 배열인지 확인하는 것이 유용 할 수 있지만 유형을 수동으로 확인해야할까요?
최대

4
@RamonMartinez assert_allclose는 unittest와 잘 어울리는 것 같습니다 :)
kotakotakota

4
@RamonMartinez 파이썬을 사용 한다면 배열이 같으면 반환 unittest할 때 사용할 수 있습니다 . self.assertIsNone(np.testing.assert_array_equal(a, b))None
mjkrause

24

(arr1 == arr2).all()꽤 괜찮은 것 같아요 . 그러나 다음을 사용할 수 있습니다.

numpy.allclose(arr1, arr2)

그러나 그것은 완전히 동일하지 않습니다.

귀하의 예와 거의 동일한 대안은 다음과 같습니다.

numpy.alltrue(arr1 == arr2)

scipy.array는 실제로 참조 numpy.array입니다. 문서를 더 쉽게 찾을 수 있습니다.


18

사용하는 self.assertEqual(arr1.tolist(), arr2.tolist()) 것이 배열을 unittest와 비교하는 가장 쉬운 방법 이라는 것을 알았습니다 .

나는 그것이 가장 예쁜 해결책이 아니며 아마도 가장 빠르지는 않지만 아마도 나머지 테스트 케이스와 더 균일하고 모든 단위 테스트 오류 설명을 얻고 구현하기가 정말 간단하다는 데 동의합니다.


1
이 잘 작동하지 않습니다 np.nan때문에, np.nan != np.nan그리고 self.assertEqual시도가 그것을 위해 계정에 할 수 없습니다.
blacksite

5

Python 3.2부터 assertSequenceEqual(array1.tolist(), array2.tolist()).

이것은 배열이 다른 정확한 항목을 표시하는 추가 가치가 있습니다.


5
불행히도 배열이 float유형일 때는 제대로 작동하지 않습니다 . 우리는 정말로 필요합니다assertSequenceAlmostEqual
grwlf 2010 년

3

내 테스트에서 나는 이것을 사용합니다.

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.