断言numpy.array平等的最好方法是什么?

mak*_*ker 89 python unit-testing numpy

我想为我的应用程序进行一些单元测试,我需要比较两个数组.由于array.__eq__返回一个新数组(因此TestCase.assertEqual失败),断言相等的最佳方法是什么?

目前我正在使用

self.assertTrue((arr1 == arr2).all())
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢它

Jos*_*sef 106

检查断言函数numpy.testing,例如

assert_array_equal

对于浮点数组,相等性测试可能会失败并且assert_almost_equal更可靠.

更新

几个版本之前获得numpy,assert_allclose这是我最喜欢的,因为它允许我们指定绝对和相对误差,并且不需要十进制舍入作为紧密度标准.

  • @RamonMartinez,如果您使用Python的“unittest”,您可以使用“self.assertIsNone(np.testing.assert_array_equal(a, b))”,因为如果数组相等,它会返回“None”。 (11认同)
  • 这与unittest如何相互作用?我认为有关这个问题的一些话会很有用. (9认同)
  • @RamonMartinez assert_allclose似乎与unittest玩得很好:) (2认同)

Sig*_*gyF 22

我认为(arr1 == arr2).all()看起来很不错.但你可以使用:

numpy.allclose(arr1, arr2)
Run Code Online (Sandbox Code Playgroud)

但它并不完全相同.

另一种方法,与您的示例几乎相同:

numpy.alltrue(arr1 == arr2)
Run Code Online (Sandbox Code Playgroud)

请注意,scipy.array实际上是一个引用numpy.array.这样可以更轻松地找到文档.


asi*_*eau 16

我发现使用 self.assertEqual(arr1.tolist(), arr2.tolist()) 是将数组与unittest进行比较的最简单方法.

我同意它不是最漂亮的解决方案,它可能不是最快的,但它可能在其他测试用例中更加统一,您可以获得所有单元测试错误描述并且实现起来非常简单.

  • 请注意,这不适用于“np.nan”,因为“np.nan!= np.nan”和“self.assertEqual”尝试将无法解释这一点。 (5认同)

Mar*_*lle 8

self.assertTrue(np.array_equal(x, y, equal_nan=True))
Run Code Online (Sandbox Code Playgroud)

equal_nan = True如果你想np.nan == np.nan退货True

或者您可以使用numpy.allclose与 torelance 进行比较。


Hag*_*aiH 5

从Python 3.2开始,您可以使用assertSequenceEqual(array1.tolist(), array2.tolist()).

这具有附加价值,可以显示数组不同的确切项目.

  • 不幸的是,当数组为"float"类型时,它不能很好地工作.我们真的需要`assertSequenceAlmostEqual` (3认同)

Edo*_*293 5

在我的测试中,我使用这个:

numpy.testing.assert_array_equal(arr1, arr2)
Run Code Online (Sandbox Code Playgroud)