Найкращий спосіб стверджувати про рівність numpy.array?


103

Я хочу зробити кілька тестів для свого додатка, і мені потрібно порівняти два масиви. Оскільки array.__eq__повертає новий масив (так TestCase.assertEqualне вдається), який найкращий спосіб стверджувати про рівність?

В даний час я використовую

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

але мені це не дуже подобається


1
зауважте, що ваш приклад може несподівано отримати True, наприклад, (np.array([1, 1]) == np.array([1])).all()вийде True
М. Бернхард

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

Відповіді:


120

перевірити функції затвердження в numpy.testing, наприклад

assert_array_equal

тест рівності для масивів з плаваючою точкою може виявитися невдалим і assert_almost_equalє більш надійним.

оновлення

Кілька версій тому отримали numpy, assert_allcloseякий зараз є моїм улюбленим, оскільки він дозволяє нам задавати як абсолютну, так і відносну помилку, і не вимагає десяткового округлення як критерій близькості.


18
Як це взаємодіє з unittest? Я думаю, що деякі слова з цього питання були б корисні.
Рамон Мартінес

Я ніколи не використовую unittest. Однак він дуже добре працює з носовими тестами, які використовуються numpy, scipy та statsmodels. Просто використовуйте твердження всередині тестової функції чи методу.
Йозеф

Це не підтверджує, що два аргументи - це обидва масивні масиви. Наприклад, він мав би успіх у масиві та списку. Для тестування може бути корисно переконатися, що це насправді масиви, але я думаю, що це потребує ручної перевірки типу?
макс

4
@RamonMartinez assert_allclose, схоже, чудово грає з unittest :)
kotakotakota

4
@RamonMartinez, якщо ви використовуєте Python, unittestви можете використовувати, self.assertIsNone(np.testing.assert_array_equal(a, b))як він повертається, Noneякщо масиви рівні.
mjkrause

24

Я думаю, (arr1 == arr2).all()виглядає досить приємно. Але ви можете використовувати:

numpy.allclose(arr1, arr2)

але це не зовсім те саме.

Альтернатива, майже така сама, як ваш приклад:

numpy.alltrue(arr1 == arr2)

Зауважте, що scipy.array насправді є еталонним numpy.array. Це полегшує пошук документації.


18

Я вважаю, що використання self.assertEqual(arr1.tolist(), arr2.tolist()) - це найпростіший спосіб порівняння масивів з unittest.

Я погоджуюся, що це не найкрасивіше рішення, і це, мабуть, не найшвидше, але це, мабуть, більш рівномірно з рештою ваших тестових випадків, ви отримуєте всі описи помилок на одиницю, і це дуже просто здійснити.


1
Зверніть увагу, що це не спрацює np.nan, оскільки np.nan != np.nanця self.assertEqualспроба не зможе це врахувати.
коваль

5

З Python 3.2 ви можете використовувати assertSequenceEqual(array1.tolist(), array2.tolist()).

Це має додаткову цінність показу вам точних елементів, в яких масиви відрізняються.


5
На жаль, він не працює добре, коли масиви мають floatтип. Нам дійсно потрібноassertSequenceAlmostEqual
grwlf

3

У своїх тестах я використовую це:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.