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

Hersteller
quelle
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.

Josef
quelle
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.

SiggyF
quelle
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.

Asimoneau
quelle
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.

HagaiH
quelle
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)
Edo user1419293
quelle
1

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

schiebermc
quelle
4
Bitte fügen Sie einen Kontext hinzu
Tobias Wilfert