Cara terbaik untuk menegaskan kesetaraan numpy.array?

103

Saya ingin membuat beberapa unit-test untuk aplikasi saya, dan saya perlu membandingkan dua array. Karena array.__eq__mengembalikan larik baru (jadi TestCase.assertEqualgagal), apa cara terbaik untuk menegaskan persamaan?

Saat ini saya menggunakan

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

tapi saya tidak terlalu menyukainya

pembuat
sumber
1
perhatikan bahwa contoh Anda dapat menghasilkan Benar secara tidak terduga, misalnya (np.array([1, 1]) == np.array([1])).all()akan menghasilkan Benar
M. Bernhardt
self.assertTrue (np.array_equal (array1, array2))
Miszo97

Jawaban:

120

periksa fungsi assert di numpy.testing, misalnya

assert_array_equal

untuk pengujian persamaan array titik mengambang mungkin gagal dan assert_almost_equallebih dapat diandalkan.

memperbarui

Beberapa versi yang lalu diperoleh numpy assert_allcloseyang sekarang menjadi favorit saya karena memungkinkan kita untuk menentukan kesalahan absolut dan relatif dan tidak memerlukan pembulatan desimal sebagai kriteria kedekatan.

Josef
sumber
18
Bagaimana ini berinteraksi dengan unittest? Saya pikir beberapa kata tentang masalah ini akan berguna.
Ramon Martinez
Saya tidak pernah menggunakan unittest. Namun, ini bekerja sangat baik dengan nosetests yang digunakan oleh numpy, scipy dan statsmodels. Cukup gunakan pernyataan di dalam fungsi atau metode pengujian.
Josef
Ini tidak memverifikasi bahwa kedua argumen adalah array numpy. Misalnya, ini akan berhasil pada array dan daftar. Untuk pengujian, mungkin berguna untuk memverifikasi bahwa ini sebenarnya adalah array, tetapi saya rasa ini akan memerlukan pemeriksaan jenis secara manual?
maks
4
@RamonMartinez assert_allclose sepertinya bermain bagus dengan unittest :)
kotakotakota
4
@RamonMartinez jika Anda menggunakan Python, unittestAnda dapat menggunakannya self.assertIsNone(np.testing.assert_array_equal(a, b))karena ia mengembalikan Nonejika arraynya sama.
mjkrause
24

Saya pikir (arr1 == arr2).all()terlihat cukup bagus. Tapi Anda bisa menggunakan:

numpy.allclose(arr1, arr2)

tapi itu tidak persis sama.

Alternatifnya, hampir sama dengan contoh Anda adalah:

numpy.alltrue(arr1 == arr2)

Perhatikan bahwa scipy.array sebenarnya adalah referensi numpy.array. Itu membuatnya lebih mudah untuk menemukan dokumentasi.

SiggyF
sumber
18

Saya menemukan bahwa menggunakan self.assertEqual(arr1.tolist(), arr2.tolist()) adalah cara termudah untuk membandingkan array dengan unittest.

Saya setuju ini bukan solusi tercantik dan mungkin bukan yang tercepat tetapi mungkin lebih seragam dengan kasus pengujian Anda yang lain, Anda mendapatkan semua deskripsi kesalahan yang paling lengkap dan sangat mudah untuk diterapkan.

asimoneau
sumber
1
Perhatikan bahwa ini tidak akan berfungsi dengan baik np.nan, karena np.nan != np.nandan self.assertEqualupaya tersebut tidak akan dapat menjelaskannya.
gelap
5

Sejak Python 3.2 Anda dapat menggunakan assertSequenceEqual(array1.tolist(), array2.tolist()).

Ini memiliki nilai tambah untuk menunjukkan kepada Anda item yang tepat di mana array berbeda.

HagaiH
sumber
5
Sayangnya, itu tidak bekerja dengan baik ketika array floatbertipe. Kami benar-benar membutuhkanassertSequenceAlmostEqual
grwlf
3

Dalam pengujian saya, saya menggunakan ini:

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

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

schiebermc.dll
sumber
4
Harap tambahkan beberapa konteks
Tobias Wilfert