Лучший способ заявить о равенстве 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