2010-07-21 7 views
64

Chcę zrobić kilka zmian w mojej aplikacji i muszę porównać dwie tablice. Od array.__eq__ zwraca nową tablicę (tak, że TestCase.assertEqual nie powiedzie się), jaki jest najlepszy sposób na zapewnienie równości?Jaki jest najlepszy sposób na zapewnienie równości numpy.array?

Obecnie używam

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

ale ja naprawdę nie podoba: \

Odpowiedz

13

myślę (arr1 == arr2).all() wygląda całkiem ładnie. Ale można użyć:

numpy.allclose(arr1, arr2) 

ale to nie jest to samo.

Alternatywą, prawie taka sama, jak np to:

numpy.alltrue(arr1 == arr2) 

Zauważ, że scipy.array jest rzeczywiście numpy.array odniesienia. Dzięki temu łatwiej jest znaleźć dokumentację.

84

sprawdź funkcje potwierdzenia w numpy.testing, np.

assert_array_equal

dla pływających tablice punktowe testu równości może zakończyć się niepowodzeniem i assert_almost_equal jest bardziej niezawodny.

aktualizacja

Kilka wersji numpy temu uzyskuje assert_allclose który jest teraz moim ulubionym, ponieważ pozwala nam określić zarówno błędu bezwzględnego i względnego i nie wymaga zaokrąglania dziesiętny jako kryterium bliskości.

+0

Jak to interakcję z unittest? Myślę, że niektóre słowa w tej sprawie byłyby użyteczne. –

+0

Nigdy nie używam unittest. Jednak działa bardzo dobrze z testami nosa, które są używane przez numpy, scipy i statsmodels. Po prostu używaj znaków wewnątrz funkcji testowej lub metody. – user333700

+0

Nie oznacza to, że oba argumenty są liczbami numpy. Na przykład zakończyłoby się pomyślnie na tablicy i liście. Do testowania może być przydatne sprawdzenie, czy są to w rzeczywistości tablice, ale przypuszczam, że wymagałoby to ręcznego sprawdzenia typu? – max

7

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 ono najszybsze, ale prawdopodobnie jest bardziej jednolite z pozostałymi przypadkami testowymi, otrzymujesz cały opis błędu unittest i jest on naprawdę prosty w implementacji.

3

Od wersji Python 3.2 można używać assertSequenceEqual(array1.tolist(), array2.tolist()).

Jest to wartość dodana pokazująca dokładnie te elementy, w których tablice różnią się.

+2

Niestety, nie działa dobrze, gdy tablice są typu 'float'. Naprawdę potrzebujemy 'assertSequenceAlmostEqual' – grwlf

0

W moich testów używam to:

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