Лучший способ заявить о равенстве numpy.array?

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

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

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

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

Ответ 1

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

assert_array_equal

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

Обновить

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

Ответ 2

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

numpy.allclose(arr1, arr2)

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

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

numpy.alltrue(arr1 == arr2)

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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