在单元测试中比较numpy浮点数数组

14

如何实现一个可以比较两个numpy浮点数组的单元测试最佳方式。

我尝试使用unittest.assertEqual()进行比较,但由于浮点数永远不会完全相等,因此对于浮点数组不起作用。我不能使用assertAlmostEqual,因为它测试的是round(floats)相等性...

有人实现过类似的东西吗?

self.assertFloatArrayEqual(array1, array2, msg = "array are not equal")

谢谢


不确定这是否对您有帮助,但是对于比较浮点数,您是否尝试过类似于“is”关键字的东西? - eazar001
我的问题的答案在unittest中比较(断言相等)包含numpy数组的两个复杂数据结构可能适用于您(虽然可能不是完全重复)。 - Lev Levitsky
使用 "is" 不是比较近似相等,而是比较两个对象的标识。相等性和标识性是两个非常不同的概念! - Ulrich Eckhardt
请在撰写问题标题时多加注意。如果您的问题具体明确,人们更有可能查看。您之前的标题意义微乎其微。 - Chris Morgan
3个回答

30

如果你已经在使用 numpy 了,为什么不直接使用 numpy 的测试函数呢?

numpy.testing.assert_array_almost_equal

numpy.testing.assert_array_almost_equal_nulp

这些函数也可以很好地处理NaN值,检查形状等。


8

尝试

self.assertTrue(numpy.allclose(array1, array2, rtol=1e-05, atol=1e-08))

numpy模块的allclose函数可以检查两个数组是否在给定的相对和绝对公差内相同。其中rtolatol是可选参数,其默认值如上所述。
感谢@DSM纠正我。

3
“within machine precision”的意思是在机器精度范围内。但我希望你不要以此为前提编写代码!在我的版本中,缺省的容限为rtol=1.e-5, atol=1.e-8,与机器精度相差甚远。请注意调整容限。 - DSM
1
虽然我认为使用unittest变量进行数组比较时,当发现差异时提供更好的输出,但这仍然比自己编写要好得多。 - Ulrich Eckhardt

1
有一个版本可以比较两个数组,当然需要numpy数组表现正常,即它们具有len()并且允许使用方括号来访问元素。现在,关于舍入误差,有可能定义一个delta或者范围,但我认为这不允许在数组上使用。
恐怕你必须自己动手了。

这就是我担心的!无论如何还是谢谢你。 - Cobry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接