Chcę wykonać testy jednostkowe dla mojej aplikacji i muszę porównać dwie tablice. Ponieważ array.__eq__
zwraca nową tablicę (a więc TestCase.assertEqual
zawodzi), jaki jest najlepszy sposób zapewnienia równości?
Obecnie używam
self.assertTrue((arr1 == arr2).all())
ale mi się to nie podoba
python
unit-testing
numpy
producent
źródło
źródło
(np.array([1, 1]) == np.array([1])).all()
da TrueOdpowiedzi:
sprawdź funkcje assert w
numpy.testing
npassert_array_equal
w przypadku tablic zmiennoprzecinkowych test równości może zakończyć się niepowodzeniem i
assert_almost_equal
jest bardziej wiarygodny.aktualizacja
Kilka wersji temu otrzymałem numpy,
assert_allclose
któ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.źródło
unittest
możesz użyć,self.assertIsNone(np.testing.assert_array_equal(a, b))
ponieważ zwraca,None
jeśli tablice są równe.Myślę, że
(arr1 == arr2).all()
wygląda całkiem nieźle. Ale możesz użyć:ale to nie to samo.
Alternatywą, prawie taką samą jak w przykładzie, jest:
Zauważ, że scipy.array jest w rzeczywistości odniesieniem numpy.array. Ułatwia to znalezienie dokumentacji.
źródło
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.
źródło
np.nan
, ponieważnp.nan != np.nan
iself.assertEqual
próba nie będzie w stanie tego uwzględnić.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ą.
źródło
float
typu. Naprawdę potrzebujemyassertSequenceAlmostEqual
W moich testach używam tego:
źródło
np.linalg.norm(arr1 - arr2) < 1e-6
źródło