Najlepszy sposób na potwierdzenie równości numpy.array?

103

Chcę wykonać testy jednostkowe dla mojej aplikacji i muszę porównać dwie tablice. Ponieważ array.__eq__zwraca nową tablicę (a więc TestCase.assertEqualzawodzi), jaki jest najlepszy sposób zapewnienia równości?

Obecnie używam

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

ale mi się to nie podoba

producent
źródło
1
zauważ, że twój przykład może dać True nieoczekiwanie, np. (np.array([1, 1]) == np.array([1])).all()da True
M. Bernhardt
self.assertTrue (np.array_equal (tablica1, tablica2))
Miszo97

Odpowiedzi:

120

sprawdź funkcje assert w numpy.testingnp

assert_array_equal

w przypadku tablic zmiennoprzecinkowych test równości może zakończyć się niepowodzeniem i assert_almost_equaljest bardziej wiarygodny.

aktualizacja

Kilka wersji temu otrzymałem numpy, assert_allclosektóry jest teraz moim ulubionym, ponieważ pozwala nam określić zarówno bezwzględny, jak i względny błąd i nie wymaga zaokrąglania dziesiętnego jako kryterium bliskości.

Josef
źródło
18
Jak to współdziała z unittest? Myślę, że przydałoby się kilka słów w tej sprawie.
Ramon Martinez
Nigdy nie używam unittest. Jednak działa bardzo dobrze z nosetestami, które są używane przez modele numpy, scipy i statsmodels. Po prostu użyj potwierdzeń wewnątrz funkcji lub metody testowej.
Josef
Nie oznacza to, że oba argumenty są tablicami numpy. Na przykład odniesie sukces w przypadku tablicy i listy. Do testowania przydatne może być sprawdzenie, czy w rzeczywistości są to tablice, ale myślę, że wymagałoby to ręcznego sprawdzenia typu?
maksymalnie
4
@RamonMartinez assert_allclose wydaje się fajnie grać z unittest :)
kotakotakota
4
@RamonMartinez, jeśli używasz Pythona, unittestmożesz użyć, self.assertIsNone(np.testing.assert_array_equal(a, b))ponieważ zwraca, Nonejeśli tablice są równe.
mjkrause
24

Myślę, że (arr1 == arr2).all()wygląda całkiem nieźle. Ale możesz użyć:

numpy.allclose(arr1, arr2)

ale to nie to samo.

Alternatywą, prawie taką samą jak w przykładzie, jest:

numpy.alltrue(arr1 == arr2)

Zauważ, że scipy.array jest w rzeczywistości odniesieniem numpy.array. Ułatwia to znalezienie dokumentacji.

SiggyF
źródło
18

Uważam, że używanie self.assertEqual(arr1.tolist(), arr2.tolist()) jest najłatwiejszym sposobem porównywania tablic z unittest.

Zgadzam się, że nie jest to najładniejsze rozwiązanie i prawdopodobnie nie jest najszybsze, ale prawdopodobnie jest bardziej jednolite z resztą przypadków testowych, otrzymujesz najbardziej nieprzejrzysty opis błędu i jest naprawdę łatwe do zaimplementowania.

asimoneau
źródło
1
Zauważ, że to nie zadziała dobrze np.nan, ponieważ np.nan != np.nani self.assertEqualpróba nie będzie w stanie tego uwzględnić.
blacksite
5

Od Pythona 3.2 możesz używać assertSequenceEqual(array1.tolist(), array2.tolist()).

Ma to wartość dodaną polegającą na wyświetlaniu dokładnych pozycji, w których tablice się różnią.

HagaiH
źródło
5
Niestety nie działa to dobrze, gdy tablice są floattypu. Naprawdę potrzebujemyassertSequenceAlmostEqual
grwlf
3

W moich testach używam tego:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)
Edo user1419293
źródło
1

np.linalg.norm(arr1 - arr2) < 1e-6

schiebermc
źródło
4
Dodaj trochę kontekstu
Tobias Wilfert,