我想为我的应用程序编写一些单元测试,并需要比较两个数组。由于array.__eq__
返回一个新数组(因此TestCase.assertEqual
失败),那么断言相等的最佳方法是什么?
目前我正在使用:
self.assertTrue((arr1 == arr2).all())
但我并不是很喜欢它
我想为我的应用程序编写一些单元测试,并需要比较两个数组。由于array.__eq__
返回一个新数组(因此TestCase.assertEqual
失败),那么断言相等的最佳方法是什么?
目前我正在使用:
self.assertTrue((arr1 == arr2).all())
但我并不是很喜欢它
请查看numpy.testing
中的assert函数,例如:
assert_array_equal
对于浮点数数组等式测试可能会失败,assert_almost_equal
更加可靠。
更新
几个版本之前,numpy获得了assert_allclose
,现在它是我最喜欢的函数,因为它允许我们指定绝对误差和相对误差,并且不需要十进制舍入作为紧密标准。
dtype
时,我们会单独进行验证。Pandas还有一个assert函数,它也检查索引和列名是否符合预期,据我所知,它使用numpy assert来验证数值,可能使用assert_equal来验证其他数据类型。 - Josefunittest
,您可以使用self.assertIsNone(np.testing.assert_array_equal(a, b))
,因为它会在数组相等时返回None
。 - mjkrause我认为 (arr1 == arr2).all()
看起来很不错。但你也可以使用:
numpy.allclose(arr1, arr2)
但是它并不完全相同。
一个替代方案,几乎与您的示例相同:
numpy.alltrue(arr1 == arr2)
请注意,scipy.array实际上是一个引用numpy.array的对象。这使得查找文档变得更容易。
我发现使用self.assertEqual(arr1.tolist(), arr2.tolist())
是使用unittest比较数组的最简单方法。
我同意它不是最美观的解决方案,可能也不是最快的,但它可能更符合你其余测试用例,你可以得到所有unittest错误描述,并且实现非常简单。
np.nan
,因为np.nan != np.nan
,而self.assertEqual
无法考虑到这一点。 - blacksiteself.assertTrue(np.array_equal(x, y, equal_nan=True))
equal_nan = True
如果你希望 np.nan == np.nan
返回 True
或者你可以使用numpy.allclose 来进行容差比较。
assertSequenceEqual(array1.tolist(), array2.tolist())
。这样做的好处是可以显示出两个数组中不同的项。float
类型时,它的工作效果不太好。我们确实需要assertSequenceAlmostEqual
。 - Grwlfnumpy.testing.assert_array_equal(arr1, arr2)
使用numpy
numpy.array_equal(a, b)
np.linalg.norm(arr1 - arr2) < 1e-6
self.assertEqual([
["1","0","1","1","0","1","1"]
], [
["1","0","1","1","0","1","x"]
])
First differing element 0:
['1', '0', '1', '1', '0', '1', '1']
['1', '0', '1', '1', '0', '1', 'x']
- [['1', '0', '1', '1', '0', '1', '1']]
? ^
+ [['1', '0', '1', '1', '0', '1', 'x']]
?
(np.array([1, 1]) == np.array([1])).all()
将会返回True。 - M. Bernhardt