Python numpy矩阵点积-意外结果

Python numpy矩阵点积-意外结果,python,numpy,floating-point,Python,Numpy,Floating Point,我有一个4x4矩阵和4x1向量。如果我手工计算点积(在excel中),我会得到不同的numpy结果值。我认为这与浮点值有关,但6.7E-3的差异似乎太大,不能仅仅是浮点误差?我错过了什么 隔离代码结果(见下文): [-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] 矩阵

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

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

[-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中请求的64位浮点值可以达到15位左右

用Python的重新计算,我得到了与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范围内,考虑到所涉及的值的规模,这似乎是合理的


可以很好地检查事物是否相对接近,但有相对宽松的默认界限。如果我用你给出的数字重新进行电子表格计算,那么
allclose
表示一切都是一致的

64位浮点的最大可表示值是巨大的=
1.7976931348623157e+308
显示代码“我在哪里进行相同的计算”。在准备矩阵值的代码中,以全精度打印数字,至少15位有效数字。请注意,在Python/numpy源代码中只使用了九个有效数字,因此会导致错误。如何将数字输入Excel?您只粘贴了9位数字吗?您是对的,使用15位数字输入numpy我得到了
[-2.18278728e-11 1.60071068e-09-3.49611670e+04 1.90697275e+05]
,这非常接近excel的结果。