Лучший способ заявить о равенстве numpy.array? - PullRequest
86 голосов
/ 21 июля 2010

Я хочу сделать несколько юнит-тестов для своего приложения, и мне нужно сравнить два массива. Так как array.__eq__ возвращает новый массив (поэтому TestCase.assertEqual терпит неудачу), как лучше всего утверждать равенство?

В настоящее время я использую

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

но мне не очень нравится

Ответы [ 6 ]

99 голосов
/ 23 июля 2010

проверить функции подтверждения в numpy.testing, например,

assert_array_equal

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

обновление

Несколько версий назад numpy получил assert_allclose, который теперь мой любимый, поскольку он позволяет нам указывать как абсолютную, так и относительную ошибку и не требует десятичного округления в качестве критерия близости.

21 голосов
/ 21 июля 2010

Я думаю (arr1 == arr2).all() выглядит довольно мило. Но вы можете использовать:

numpy.allclose(arr1, arr2)

но это не совсем то же самое.

Альтернатива, почти такая же, как ваш пример:

numpy.alltrue(arr1 == arr2)

Обратите внимание, что scipy.array на самом деле является ссылочным numpy.array. Это облегчает поиск документации.

15 голосов
/ 25 сентября 2014

Я считаю, что использование self.assertEqual(arr1.tolist(), arr2.tolist()) - это самый простой способ сравнения массивов с unittest.

Я согласен, что это не самое красивое решение, и, вероятно, оно не самое быстрое, но, вероятно, оно более равномерно с остальной частью вашего тестаВ некоторых случаях вы получаете все описания ошибок unittest, и их действительно просто реализовать.

5 голосов
/ 02 июля 2017

Начиная с Python 3.2 вы можете использовать assertSequenceEqual(array1.tolist(), array2.tolist()).

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

2 голосов
/ 07 марта 2018

В своих тестах я использую это:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)
0 голосов
/ 11 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...