3
x = [1, 2, 3, ... ]
y = sum(x)

x是2165496761,大于32位整数的限制所以sum(x)返回-2129470535。

如何通过将其转换为长整数来获得正确的值?

这是我的进口清单:

import math, csv, sys, re, time, datetime, pickle, os, gzip
from numpy import *
4

3 回答 3

14

二十个 quatloos 说你正在使用numpy的 sum 函数:

>>> sum(xrange(10**7))
49999995000000L
>>> from numpy import sum
>>> sum(xrange(10**7))
-2014260032

所以我敢打赌你已经from numpy import *或正在使用一些等效的界面。

要验证这一点,请尝试

print type(sum(x))

在此线程其他地方发布的示例中:

>>> sum([721832253, 721832254, 721832254])
-2129470535
>>> type(sum([721832253, 721832254, 721832254]))
<type 'numpy.int32'>

编辑:有人欠我二十四分钱!要么不使用星形导入(最好),手动设置dtype

>>> sum([721832253, 721832254, 721832254],dtype=object)
2165496761L

或显式引用内置sum函数(可能给它一个更方便的绑定):

>>> __builtins__.sum([721832253, 721832254, 721832254])
2165496761L
于 2012-10-03T19:51:56.720 回答
3

您获得此无效值的原因是您正在np.sum使用int32. 没有什么可以阻止您使用 anp.int32而是 a np.int64ornp.int128 dtype来表示您的数据。例如,您可以使用

x.view(np.int64).sum()

在旁注中,请确保您从不使用from numpy import *. 这是一种可怕的做法,你必须尽快改掉这种习惯。当您使用 时from ... import *,您可能会覆盖一些 Python 内置函数,这使得调试变得非常困难。典型的例子,你覆盖像sumor max...

于 2012-10-03T20:49:53.753 回答
2

Python 以任意精度处理大量数字:

>>> sum([721832253, 721832254, 721832254])
2165496761

总结一下吧!

为确保您不使用numpy.sum,请尝试使用__builtins__.sum()

于 2012-10-03T19:50:24.767 回答