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


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.


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.


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.


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ą.


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.