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

C_Z*_*_Z_ 10 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.
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来控制它.