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 Decimal
s 重做计算给了我一些非常接近 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
说一切都是一致的
我有一个 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 Decimal
s 重做计算给了我一些非常接近 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
说一切都是一致的