我想测试两个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.
Run Code Online (Sandbox Code Playgroud)
现在,我知道np.array_equal,比较元素和形状,但它不允许我测试元素是否接近,只有它们是相等的.例如,
np.array_equal(x,y)
Run Code Online (Sandbox Code Playgroud)
返回 False
是否有一个我可以使用的函数将返回true (x,y),(z1,z2)但(x,z1)在这种情况下是false ?
Joe*_*ton 10
正在发生的是allclose广播其输入.这允许遵循广播规则与类似形状的阵列(例如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]])
Run Code Online (Sandbox Code Playgroud)
产量:
AssertionError:
Not equal to tolerance rtol=1e-07, atol=0
(shapes (1,), (1, 1) mismatch)
x: array([1])
y: array([[1]])
Run Code Online (Sandbox Code Playgroud)
关于这些功能的另一个有用的(目前还没有很好的记录)是他们比较NaN的平等.
例如,这将成功:
In [3]: np.testing.assert_allclose([np.nan], [np.nan])
Run Code Online (Sandbox Code Playgroud)
虽然numpy.allclose将返回False相同的情况:
In [4]: np.allclose([np.nan], [np.nan])
Out[4]: False
Run Code Online (Sandbox Code Playgroud)
在旁注中,numpy.isclose(但不是allclose)有一个equal_nankwarg来控制它.