numpy.dot给出大整数的错误答案

时间:2018-06-03 21:32:34

标签: python arrays numpy dot-product

我正在研究一些线性代数的东西,并且根本无法弄清楚为什么numpy给出了以下内容:

enter image description here

我从mathematica得到的结果是手工

enter image description here

修改:如果您需要矩阵:

test = [[19722145, -21016468, 51417377],
        [-185674670, 298847128, -428429486],
        [289326728, -516012704, 691212936]]

A = [[9, 4, 1], [2, 0, 8], [-8, 8, -8]]

2 个答案:

答案 0 :(得分:2)

如@PaulPanzer所述,您需要使用np.int64 dtype数组。 NumPy在您的平台/系统配置 1 上使用np.int32作为输入数组,并且不检查整数溢出。

但是,矩阵乘法的结果包括太大而不能存储在np.int32中的整数。

由于NumPy不会自动将输入数组向上转换为np.int64,因此您需要明确指定np.int64,无论是在定义数组时还是通过向上转换:

import numpy as np

test = np.array([[19722145, -21016468, 51417377],
                 [-185674670, 298847128, -428429486],
                 [289326728, -516012704, 691212936]],
                dtype=np.int64)

A = np.array([[9, 4, 1],
              [2, 0, 8],
              [-8, 8, -8]],
             dtype=np.int64)

res = np.dot(test, A)

print(res)

[[ -275872647   490227596  -559748615]
 [ 2354058114 -4170134568  5632538242]
 [-3957788344  6687010400 -9368478392]]

1 这是another example。还有一些discussion on platform-specific issues

答案 1 :(得分:0)

Python(或Perl,C,C ++,Java,Fortran和其他许多语言)通常不会显示您期望的确切十进制数字

https://docs.python.org/2/tutorial/floatingpoint.html

这可能会帮助