为什么内置的sum在“from numpy import *"之后会出现错误?

0qx6xfy6  于 2023-01-30  发布在  其他
关注(0)|答案(3)|浏览(153)

我有一些代码:

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

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

x中实际值的总和为2165496761,大于32位整数的限制。报告的y值为-2129470535,表示整数溢出。
为什么会这样呢?我以为内置的sum应该使用Python的任意大小的整数呢?
如果您在REPL(解释器提示符)中意外地执行了类似的操作,请参见How to restore a builtin that I overwrote by accident?

xdyibdwo

xdyibdwo1#

执行from numpy import *会导致内置的sum函数替换为numpy.sum

>>> sum(xrange(10**7))
49999995000000L
>>> from numpy import sum
>>> sum(xrange(10**7)) # assuming a 32-bit platform
-2014260032

要验证numpy.sum是否正在使用,请尝试检查结果的type

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

要避免此问题,请不要使用星星导入。
如果必须使用numpy.sum,并且想要任意大小的整数结果,请为结果指定dtype,如下所示:

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

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

>>> __builtins__.sum([721832253, 721832254, 721832254])
2165496761L
jtoj6r0c

jtoj6r0c2#

你得到这个无效值的原因是你在int32上使用np.sum。没有什么可以阻止你使用np.int32,而是使用np.int64np.int128dtype来表示你的数据。

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

顺便说一句,请确保你从来没有使用from numpy import *。这是一个可怕的做法和习惯,你必须尽快摆脱。当你使用from ... import *,你可能会覆盖一些Python内置,这使得调试非常困难。典型的例子,你覆盖像summax这样的函数...

nle07wnf

nle07wnf3#

Python可以处理任意精度的大数:

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

总结一下!
要确保不使用numpy.sum,请尝试使用__builtins__.sum()

相关问题