【问题标题】:Assert array almost equal zero断言数组几乎等于零
【发布时间】:2020-11-27 04:32:17
【问题描述】:

我正在为我的模拟编写单元测试,并想检查特定参数的结果(一个 numpy 数组)是否为零。由于计算不准确,也接受较小的值 (1e-7)。断言这个数组在所有地方都接近 0 的最佳方法是什么?

  • np.testing.assert_array_almost_equal(a, np.zeros(a.shape))assert_allclose 失败,因为相对容差为 inf(如果切换参数,则为 1)Docu
  • 我觉得np.testing.assert_array_almost_equal_nulp(a, np.zeros(a.shape))不够精确,因为它将差异与间距进行比较,因此nulps >= 1始终为真,否则为假,但没有说明a的幅度Docu
  • 基于this question使用np.testing.assert_(np.all(np.absolute(a) < 1e-7))并没有给出任何详细的输出,我已经习惯了其他np.testing方法

还有其他方法可以测试吗?也许另一个测试包?

【问题讨论】:

  • 为什么不能使用assert_allclose 中的绝对容差参数呢?
  • 谢谢,@MrBeanBremen,你是完全正确的。您可以将其发布为答案,以便我接受吗?抱歉,我没有想到这个简单的解决方案。
  • 另外,np.zeros 的构造不起作用,使用np.zeros_like 可能会更好。

标签: python arrays unit-testing assert


【解决方案1】:

如果你比较一个全为零的 numpy 数组,你可以使用绝对容差,因为相对容差在这里没有意义:

from numpy.testing import assert_allclose

def test_zero_array():
    a = np.array([0, 1e-07, 1e-08])
    assert_allclose(a, 0, atol=1e-07)

rtol 值在这种情况下无关紧要,因为如果计算公差,它会乘以 0:

atol + rtol * abs(desired)

更新:将 np.zeros_like(a) 替换为更简单的标量 0。正如 @hintze 所指出的,np 数组比较也适用于标量。

【讨论】:

  • 小事,但仍然:assert_allclose 可以比较 ND 数组和标量,因此无需使用 np.zeros_like() ;)
  • @hintze - 谢谢,很好!我相应地调整了答案。
猜你喜欢
  • 2012-01-23
  • 2014-06-26
  • 1970-01-01
  • 2016-11-25
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多