我有以下两个向量之和的简单代码。
但是,当我使用 NumPy 时,我得到了错误的结果。
在[12]中:%run -i test.py
总和的最后 2 个元素 [7980015996L, 7992002000L]
总和的最后 2 个元素 [-609918596 -597932592]
它不是一个长整数,为什么?
import numpy as np
def numpysum(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return c
def pythonsum(n):
a = range(n)
b = range(n)
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] + b[i])
return c
size = 2000
c = pythonsum(size)
print "The last 2 elements of the sum", c[-2:]
c = numpysum(size)
print "The last 2 elements of the sum", c[-2:]
Run Code Online (Sandbox Code Playgroud)
普通 Python 整数可以增长任意大。Numpy 整数不能;它们受到数据类型大小的限制。如果它们变得太大,它们就会缠绕并变得消极。看来您的数组数据类型可能是 int32,它会溢出并导致负结果。在这种情况下,您可以使用 int64 获得正确的结果:
a = np.arange(n, dtype=np.int64) ** 2
b = np.arange(n, dtype=np.int64) ** 3
Run Code Online (Sandbox Code Playgroud)
然而,它最终仍然会溢出(如果你做得size更大)。您还可以使用float64,它允许更大的数字,但这样您就会失去精度。
整数大小的上限是您为 numpy 提供的速度所付出的代价。