numpy 矩阵点积 - 意外结果

numpy matrix dot product - unexpected result

我有一个 4x4 矩阵和 4x1 向量。如果我手动计算点积(在 excel 中),我会得到与 numpy 结果不同的值。我希望它与 float 值有关,但是例如 6.7E-3 的差异似乎太大而不仅仅是 float 错误?我错过了什么?

隔离代码结果(见下文):

[-3.24218399e-06 1.73591630e-04 -3.49611749e+04 1.90697291e+05]

手算(excel):

[-1.04791731E-11 7.08581638E-10 -3.49611670E+04 1.90697275E+05]

矩阵的输入值是从代码中提取的,我在代码中进行了相同的评估。结果是:

[-2.09037901e-04 6.77221033e-03 -3.49612277e+04 1.90697438e+05]

孤立的输入值:

import numpy as np

arrX1 = np.array([
[-2.18181817e+01, 1.78512395e+03,-5.84222383e+04, 7.43555757e+05],
[ 8.92561977e+02,-6.81592780e+04, 2.07133390e+06,-2.43345520e+07],
[-9.73703971e+03, 6.90444632e+05,-1.96993992e+07, 2.21223199e+08],
[ 3.09814899e+04,-2.02787933e+06, 5.53057997e+07,-6.03335995e+08]],
dtype=np.float64)

arrX2 = np.array([0,-1.97479339E+00,-1.20681818E-01,-4.74107143E-03],dtype=np.float64)

print (np.dot(arrX1, arrX2))  
#-> [-3.24218399e-06  1.73591630e-04 -3.49611749e+04  1.90697291e+05]

猜测这是因为您从 Excel 中提取的值精度太低。您问题中的值只有 9 位有效数字,而 Excel 中使用的 64 位浮点数以及您在 Numpy 中请求的值大约为 15 位数字。

用 Python 的 arbitrary precision Decimals 重做计算给了我一些非常接近 Numpy 的答案:

from decimal import Decimal as D, getcontext

x = [1.78512395e+03,-5.84222383e+04, 7.43555757e+05]
y = [-1.97479339E+00,-1.20681818E-01,-4.74107143E-03]

# too much precision please
getcontext().prec = 50

sum(D(x) * D(y) for x, y in zip(x, y))

从 Numpy 得到的值在 ~4e-13 以内,考虑到所涉及值的规模,这似乎是合理的。

np.allclose 可以很好地检查事物是否相对接近,但默认范围相对宽松。如果我用你给的数字重做电子表格计算,那么 allclose 说一切都是一致的