断言numpy.array相等的最佳方法?


103

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

目前我正在使用

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

但我不是很喜欢


1
请注意,您的示例可能(np.array([1, 1]) == np.array([1])).all()会意外生成True,例如,将生成True
M. Bernhardt

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

Answers:


120

在中检出assert函数numpy.testing,例如

assert_array_equal

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

更新

之前获得了一些版本的numpy assert_allclose,现在它是我的最爱,因为它允许我们指定绝对误差和相对误差,并且不需要十进制舍入作为接近度标准。


18
这如何与单元测试交互?我认为对此事有些话是有用的。
拉蒙·马丁内斯

我从不使用unittest。但是,它与numpy,scipy和statsmodels使用的鼻子测试一起使用时效果很好。只需在测试函数或方法中使用断言即可。
约瑟夫(Josef)

这不能验证两个参数都是numpy数组。例如,它将在数组和列表上成功执行。对于测试,验证这些数组实际上是数组可能会很有用,但是我想这需要手动检查类型?
最多

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的最简单方法。

我同意这不是最漂亮的解决方案,并且可能不是最快的解决方案,但是与其余测试用例相比,它可能更统一,您可以获得所有unittest错误描述,并且实现起来非常简单。


1
请注意,这不会很好地工作np.nan,因为np.nan != np.nanself.assertEqual企图将无法以考虑。
blacksite

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.