使用 NumPy 时的长整数

Pir*_*two 5 python numpy

我有以下两个向量之和的简单代码。

但是,当我使用 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)

Bre*_*arn 4

普通 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 提供的速度所付出的代价。

  • 您仍然可以获得所有很酷的功能。就像简单地在数组上使用“** 3”或两个数组的“a + b”一样。或者矩阵乘法如“a * b”等。在纯Python中,这需要更多代码,这需要更多的编写和读取工作。NumPy 不仅仅关乎执行速度。 (3认同)