我想测试两个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吗?
答案 0 :(得分:10)
发生了什么allclose
广播其输入。这样可以在broadcasting rules之后与类似形状的数组(例如3
和[3, 3, 3]
)进行比较。
为了您的目的,请查看numpy.testing
函数,特别是np.testing.assert_allclose
或assert_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来控制它。