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 *
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 *
二十个 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
您获得此无效值的原因是您正在np.sum
使用int32
. 没有什么可以阻止您不使用 anp.int32
而是 a np.int64
ornp.int128
dtype
来表示您的数据。例如,您可以使用
x.view(np.int64).sum()
在旁注中,请确保您从不使用from numpy import *
. 这是一种可怕的做法,你必须尽快改掉这种习惯。当您使用 时from ... import *
,您可能会覆盖一些 Python 内置函数,这使得调试变得非常困难。典型的例子,你覆盖像sum
or max
...
Python 以任意精度处理大量数字:
>>> sum([721832253, 721832254, 721832254])
2165496761
总结一下吧!
为确保您不使用numpy.sum
,请尝试使用__builtins__.sum()
。