Der beste Weg, um für numpy.array Gleichheit zu behaupten?


102

Ich möchte einige Unit-Tests für meine App durchführen und muss zwei Arrays vergleichen. Was ist der beste Weg, um Gleichheit zu behaupten, da array.__eq__ein neues Array zurückgegeben wird ( TestCase.assertEqualwas fehlschlägt)?

Zur Zeit benutze ich

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

aber ich mag es nicht wirklich


1
Beachten Sie, dass Ihr Beispiel unerwartet True ergeben kann, z. B. (np.array([1, 1]) == np.array([1])).all()True
M. Bernhardt

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

Antworten:


119

Überprüfen Sie die Assert-Funktionen in numpy.testingz

assert_array_equal

Bei Gleitkomma-Arrays schlägt der Gleichheitstest möglicherweise fehl und assert_almost_equalist zuverlässiger.

aktualisieren

Vor einigen Versionen wurde numpy erhalten, assert_allclosewas jetzt mein Favorit ist, da es uns ermöglicht, sowohl absolute als auch relative Fehler anzugeben und keine Dezimalrundung als Nähekriterium erfordert.


17
Wie interagiert das mit unittest? Ich denke, dass einige Worte zu diesem Thema nützlich wären.
Ramon Martinez

Ich benutze nie unittest. Es funktioniert jedoch sehr gut mit Nosetests, die von Numpy-, Scipy- und Statistikmodellen verwendet werden. Verwenden Sie einfach die Asserts innerhalb einer Testfunktion oder -methode.
Josef

Dies überprüft nicht, ob die beiden Argumente beide Numpy-Arrays sind. Zum Beispiel würde es auf einem Array und einer Liste erfolgreich sein. Zum Testen kann es nützlich sein, zu überprüfen, ob es sich tatsächlich um Arrays handelt, aber ich denke, es würde eine manuelle Überprüfung des Typs erfordern.
Max

4
@ RamonMartinez assert_allclose scheint gut mit unittest zu spielen :)
kotakotakota

4
@RamonMartinez Wenn Sie Pythons verwenden unittest, können Sie diese verwenden, self.assertIsNone(np.testing.assert_array_equal(a, b))da sie zurückgegeben werden, Nonewenn die Arrays gleich sind.
mjkrause

24

Ich finde (arr1 == arr2).all()sieht ziemlich gut aus. Aber Sie könnten verwenden:

numpy.allclose(arr1, arr2)

aber es ist nicht ganz dasselbe.

Eine Alternative, fast die gleiche wie in Ihrem Beispiel, ist:

numpy.alltrue(arr1 == arr2)

Beachten Sie, dass scipy.array tatsächlich eine Referenz numpy.array ist. Das erleichtert das Auffinden der Dokumentation.


18

Ich finde, dass die Verwendung self.assertEqual(arr1.tolist(), arr2.tolist()) der einfachste Weg ist, Arrays mit unittest zu vergleichen.

Ich bin damit einverstanden, dass es nicht die schönste und wahrscheinlich nicht die schnellste Lösung ist, aber es ist wahrscheinlich einheitlicher mit dem Rest Ihrer Testfälle, Sie erhalten die unitteste Fehlerbeschreibung und es ist wirklich einfach zu implementieren.


1
Beachten Sie, dass dies nicht gut funktioniert np.nan, da np.nan != np.nander self.assertEqualVersuch dies nicht erklären kann.
Blacksite

5

Seit Python 3.2 können Sie verwenden assertSequenceEqual(array1.tolist(), array2.tolist()).

Dies hat den Mehrwert, Ihnen die genauen Elemente anzuzeigen, in denen sich die Arrays unterscheiden.


5
Leider funktioniert es nicht gut, wenn Arrays vom floatTyp sind. Wir brauchen wirklichassertSequenceAlmostEqual
grwlf

3

In meinen Tests verwende ich Folgendes:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.