numpy.array_equal返回False,即使数组具有相同的形状和值

iro*_*ein 2 python numpy linear-algebra matrix-multiplication

我有一个非常简单的功能,如下所示

def new_price(A, B, x):
    return np.linalg.inv(A @ B) @ x
Run Code Online (Sandbox Code Playgroud)

这些是我给它的输入

A = np.array([
    [2, 0, 1, 0],
    [1, 1, 1, 1],
    [0, 0, 0, 10]
]) 

B = np.array([
    [3, 3, 3],
    [2, 0, 8],
    [0, 5, 3],
    [0, 0, 10] 
])

x = np.array([ 84, 149, 500])
Run Code Online (Sandbox Code Playgroud)

这将返回数组[ 1. 3. 5.].但是,当我进行以下等式检查时,它会返回False

v1 = new_price(A, B, x)
v2 = np.array([1.0, 3.0, 5.0])
np.array_equal(new_price(A, B, [ 84, 149, 500]), np.array([1.0, 3.0, 5.0]))
Run Code Online (Sandbox Code Playgroud)

我检查了两个阵列的形状和类型是一样的.我在这里错过了什么?

Mik*_*ler 5

不完全相同:

>>> new_price(A, B, [ 84, 149, 500]) -  np.array([1, 3, 5])
array([  2.84217094e-14,  -1.42108547e-14,   0.00000000e+00])
Run Code Online (Sandbox Code Playgroud)

更好用np.allclose():

>>> np.allclose(new_price(A, B, [ 84, 149, 500]), np.array([1.0, 3.0, 5.0]))
True
Run Code Online (Sandbox Code Playgroud)

如果两个数组在容差范围内在元素方面相等,则返回True.

您可以调整相对和绝对容差.

对于非常小的值仍然如此:

>>> np.allclose(new_price(A, B, [ 84, 149, 500]), np.array([1.0, 3.0, 5.0]),
                atol=1e-13, rtol=1e-14)
True
Run Code Online (Sandbox Code Playgroud)

找到了限制:

>>> np.allclose(new_price(A, B, [ 84, 149, 500]), np.array([1.0, 3.0, 5.0]),
                atol=1e-14, rtol=1e-14)
False
Run Code Online (Sandbox Code Playgroud)