测试两个numpy数组是否(接近)相等,包括形状

时间:2015-09-30 20:16:56

标签: python numpy

我想测试两个numpy数组是否(接近)相等,所以我一直在使用np.allclose函数。唯一的问题是,如果给定一个二维矩阵和一个相等元素的三维矩阵,它将返回True

import numpy as np

x = np.array([[3.14159265, -0.1], [-0.1, 0.1]])

y = np.array([[math.pi, -0.1], [-0.1, 0.1]])

z1 = np.array([[[3.14159265, -0.1], [-0.1, 0.1]],
              [[3.14159265, -0.1], [-0.1, 0.1]]])
z2 = np.array([[[math.pi, -0.1], [-0.1, 0.1]],
              [[math.pi, -0.1], [-0.1, 0.1]]])  


np.allclose(x,y)
# Returns true, as expected

np.allclose(x,z1)
# Also returns true, even though matrices are different shapes. Unwanted.

现在,我知道np.array_equal,它比较了元素和形状,但它不允许我测试元素是否接近,只有它们相等。例如,

np.array_equal(x,y)

返回False

我可以使用的函数对于(x,y)(z1,z2)都会返回true,但在这种情况下对于(x,z1)会返回false吗?

1 个答案:

答案 0 :(得分:10)

发生了什么allclose广播其输入。这样可以在broadcasting rules之后与类似形状的数组(例如3[3, 3, 3])进行比较。

为了您的目的,请查看numpy.testing函数,特别是np.testing.assert_allcloseassert_array_almost_equal,它们将检查形状和值。 (我不记得这两者之间的区别,但它与计算浮点差异的方式有关。)

如果您使用基于断言的单元测试,这些特别方便。

大多数(全部?)numpy.testing.assert_*函数检查数组形状以及值相等。

例如:

In [1]: import numpy as np

In [2]: np.testing.assert_allclose([1], [[1]])

哪个收益率:

AssertionError:
Not equal to tolerance rtol=1e-07, atol=0

(shapes (1,), (1, 1) mismatch)
 x: array([1])
 y: array([[1]])

了解这些功能的另一个有用的(当前没有尽可能详细记录)是他们将NaN' s等同。

例如,这将成功:

In [3]: np.testing.assert_allclose([np.nan], [np.nan])

虽然numpy.allclose将针对相同的案例返回False

In [4]: np.allclose([np.nan], [np.nan])
Out[4]: False

在旁注中,numpy.isclose(但不是allclose)有一个equal_nan kwarg来控制它。