【问题标题】:numpy testing assert array NOT equalnumpy 测试断言数组不等于
【发布时间】:2016-11-25 03:40:32
【问题描述】:

我们有numpy.testing.assert_array_equal 断言两个数组相等。

但是numpy.testing.assert_array_not_equal 的最佳做法是什么,即确保两个数组不相等?

【问题讨论】:

  • 数组有多不相等?它们必须在每个元素上都不同,或者至少在一个元素上不同吗?
  • 至少有一个元素不相等。也就是说,两个数组的内容可能不一样。如果一个元素不同,一切都很好。
  • 那么@Eswcvlad 的回答可能是你能找到的最优雅的hack。

标签: python numpy python-unittest


【解决方案1】:

我认为 NumPy 测试框架中没有直接内置任何内容,但您可以使用:

np.any(np.not_equal(a1,a2))

并使用内置的 unittest 框架断言 true 或使用 NumPy 以 assert_equalTrue 进行检查,例如

np.testing.assert_equal(np.any(np.not_equal(a,a)), True)

【讨论】:

  • 您可能应该只使用TestCase.assertTrue(np.any(…))(如果您不在TestCase 范围内,则使用nose.tools.assert_true(np.any(…)))。
【解决方案2】:

如果你想专门使用 NumPy 测试,那么你可以使用 numpy.testing.assert_array_equalnumpy.testing.assert_raises 来获得相反的结果。例如:

assert_raises(AssertionError, assert_array_equal, array_1, array_2)

还有numpy.testing.utils.assert_array_comparenumpy.testing.assert_array_equal 使用它),但我没有看到它在任何地方记录,因此请谨慎使用。这将检查每个元素是否不同,所以我想这不是你的用例:

import operator

assert_array_compare(operator.__ne__, array_1, array_2)

【讨论】:

  • 第一种方法的简洁技巧。据我所知,只有当每个元素(而不仅仅是一些元素)都不同时,第二个才会成功。不确定这是否是OP想要的。 +1 无论哪种方式。
  • 是的,你说的第二个是对的。将编辑答案。
  • 第一个为我做的!谢谢!
【解决方案3】:

不知道为什么没有发布,可能是我没有正确理解这个问题,但是:

assert not np.array_equal(array1 , array2)

您为什么希望将它专门保留在 numpy 的测试模块中?

【讨论】:

  • assert_array_equal 将 NaN 处理为值,而不是像通常的浮点那样无法比较(总是不等于任何东西)
【解决方案4】:

@Eswcvlad 的回答更简洁:

import numpy as np

with np.testing.assert_raises(AssertionError):
    np.testing.assert_array_equal(expected, actual)

【讨论】:

    【解决方案5】:

    也许您通常想要测试某事物是否几乎相等(考虑小数精度),因此在某些情况下想要测试某事物是否几乎相等。基于@Mikhail 的回答(也使用 pytest.raises),这将给出:

    import numpy as np
    import pytest
     
    with pytest.raises(AssertionError):
       np.testing.assert_almost_equal(...)
    

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2011-11-10
      • 2020-03-17
      • 2015-01-14
      • 2016-08-21
      • 1970-01-01
      • 2010-10-28
      • 2013-09-16
      • 2019-05-08
      相关资源
      最近更新 更多