向量乘法矩阵期间的 Numpy 点问题
Numpy dot issue during matrix by vector multiplication
编辑:好吧,所以,我确实很愚蠢。我建议关闭这个问题,因为它不会给 table 带来任何好处。基本上,我凌晨 2 点的基本思维和数学很糟糕...
这让我发疯。我正在尝试在 python.
中获取矩阵与向量的乘积
我有一个 9x9 矩阵 a 和一个 1x9 向量 b。
a = [[-0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04756713402738598, -0.06941534088216819]]
a = np.array(a)
b = [2.774218316317263e-09, 1.9240011547847137e-09, 1.3342489213593189e-09, 9.251229045630879e-10, 6.412369741504171e-10, 4.441595895415701e-10, 3.07211064663576e-10, 2.1185176007909776e-10, -4.172326584582343e-11]
b = np.array(b)
print(np.dot(a,b))
>>> array([-6.77921802e-11, 0.00000000e+00, 6.46234854e-27, 0.00000000e+00,
6.46234854e-27, 3.23117427e-27, -4.84676140e-27, -3.16751358e-12,
1.29734158e-11])
我期待什么:
...
2nd value: 0.01694805 * 2.77421832e-09 -0.03619046 * 1.92400115e-09 + 0.01694805 * 1.33424892e-09
>>> 2.15478530e-17
...
array([-6.77921695e-11, 2.15478530e-17, 1.47710395e-17, 1.02173204e-17,
7.13131671e-18, 4.91186255e-18, 3.40092760e-18, 2.36168005e-18,
-7.44835521e-19])
这是关键:
c = array([[-0.03619046, 0.01694805, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0.01694805, -0.03619046, 0.01694805, 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0.01694805, -0.03619046, 0.01694805, 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0.01694805, -0.03619046, 0.01694805,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.01694805, -0.03619046,
0.01694805, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0.01694805,
-0.03619046, 0.01694805, 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0.01694805, -0.03619046, 0.01694805, 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0.01694805, -0.03619046, 0.01694805],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.04756713, -0.06941534]])
np.dot(c,b)
>>> array([-6.77921692e-11, 2.13353146e-17, 1.47955319e-17, 1.02587195e-17,
7.11069875e-18, 4.92530088e-18, 3.40667400e-18, -3.16751216e-12,
1.29734149e-11])
如您所见,c 是 a 的近似值,具有较少的有效数字。使用它给了我预期的结果。我是在打一些数字神器吗?还是我犯了一个巨大而愚蠢的错误?
请注意,a @ b 和 np.matmul(a,b) 遇到相同的问题。
我正在使用 Python 3.7.0 和 Numpy 1.15.0
看来你复制粘贴的数字有误。
print(np.dot(a, b))
print(np.dot(a[1], b))
print(
0.01694804504223569 * 2.774218316317263e-09
+ -0.03619046050233981 * 1.9240011547847137e-09
+ 0.01694804504223569 * 1.3342489213593189e-09
)
[-6.77921802e-11 0.00000000e+00 6.46234854e-27 0.00000000e+00
6.46234854e-27 3.23117427e-27 -4.84676140e-27 -3.16751358e-12
1.29734158e-11]
-6.462348535570529e-27
-6.462348535570529e-27
np.dot(a, b)[1]
不完全等于 np.dot(a[1], b)
有点奇怪,但这个幅度并不奇怪。
您可以尝试使用 accupy 的 kdot
/fdot
(我的一个项目),看看这些舍入失败的实现是否对您有任何好处。
编辑:好吧,所以,我确实很愚蠢。我建议关闭这个问题,因为它不会给 table 带来任何好处。基本上,我凌晨 2 点的基本思维和数学很糟糕...
这让我发疯。我正在尝试在 python.
中获取矩阵与向量的乘积我有一个 9x9 矩阵 a 和一个 1x9 向量 b。
a = [[-0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01694804504223569, -0.03619046050233981, 0.01694804504223569], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04756713402738598, -0.06941534088216819]]
a = np.array(a)
b = [2.774218316317263e-09, 1.9240011547847137e-09, 1.3342489213593189e-09, 9.251229045630879e-10, 6.412369741504171e-10, 4.441595895415701e-10, 3.07211064663576e-10, 2.1185176007909776e-10, -4.172326584582343e-11]
b = np.array(b)
print(np.dot(a,b))
>>> array([-6.77921802e-11, 0.00000000e+00, 6.46234854e-27, 0.00000000e+00,
6.46234854e-27, 3.23117427e-27, -4.84676140e-27, -3.16751358e-12,
1.29734158e-11])
我期待什么:
...
2nd value: 0.01694805 * 2.77421832e-09 -0.03619046 * 1.92400115e-09 + 0.01694805 * 1.33424892e-09
>>> 2.15478530e-17
...
array([-6.77921695e-11, 2.15478530e-17, 1.47710395e-17, 1.02173204e-17,
7.13131671e-18, 4.91186255e-18, 3.40092760e-18, 2.36168005e-18,
-7.44835521e-19])
这是关键:
c = array([[-0.03619046, 0.01694805, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0.01694805, -0.03619046, 0.01694805, 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0.01694805, -0.03619046, 0.01694805, 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0.01694805, -0.03619046, 0.01694805,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.01694805, -0.03619046,
0.01694805, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0.01694805,
-0.03619046, 0.01694805, 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0.01694805, -0.03619046, 0.01694805, 0. ],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0.01694805, -0.03619046, 0.01694805],
[ 0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0.04756713, -0.06941534]])
np.dot(c,b)
>>> array([-6.77921692e-11, 2.13353146e-17, 1.47955319e-17, 1.02587195e-17,
7.11069875e-18, 4.92530088e-18, 3.40667400e-18, -3.16751216e-12,
1.29734149e-11])
如您所见,c 是 a 的近似值,具有较少的有效数字。使用它给了我预期的结果。我是在打一些数字神器吗?还是我犯了一个巨大而愚蠢的错误?
请注意,a @ b 和 np.matmul(a,b) 遇到相同的问题。
我正在使用 Python 3.7.0 和 Numpy 1.15.0
看来你复制粘贴的数字有误。
print(np.dot(a, b))
print(np.dot(a[1], b))
print(
0.01694804504223569 * 2.774218316317263e-09
+ -0.03619046050233981 * 1.9240011547847137e-09
+ 0.01694804504223569 * 1.3342489213593189e-09
)
[-6.77921802e-11 0.00000000e+00 6.46234854e-27 0.00000000e+00
6.46234854e-27 3.23117427e-27 -4.84676140e-27 -3.16751358e-12
1.29734158e-11]
-6.462348535570529e-27
-6.462348535570529e-27
np.dot(a, b)[1]
不完全等于 np.dot(a[1], b)
有点奇怪,但这个幅度并不奇怪。
您可以尝试使用 accupy 的 kdot
/fdot
(我的一个项目),看看这些舍入失败的实现是否对您有任何好处。