numpy-Python RuntimeWarning:在长标量中遇到溢出

我是编程新手。 在我最新的Python 2.7项目中,我遇到了以下问题:

RuntimeWarning:long_scalars中遇到溢出

有人可以详细说明这意味着什么,我可以做些什么来解决这个问题?

代码一直运行,但是我不确定忽略警告是否是个好主意。

它发生在附加过程中,例如:

SomeList.append(VeryLongFormula)
timkado asked 2020-07-04T13:19:14Z
2个解决方案
50 votes

这是发出相同警告的示例:

import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a

产量

RuntimeWarning: overflow encountered in long_scalars

在上面的示例中,发生这种情况的原因是dtypes是dtype int32,并且在int32中可存储的最大值是2 ** 31-1。 从10**10 > 2**32-1开始,求幂的结果大于在int32中可以存储的数。

请注意,您不能依靠dtypes来捕获所有溢出numpy中的错误。 例如,在32位NumPy上

>>> np.multiply.reduce(np.arange(21)+1)
-1195114496

在64位NumPy上:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848

两者都失败,没有任何警告,尽管这也是由于溢出错误引起的。 正确的答案是21! 等于

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L

根据Numpy开发人员Robert Kern所说,

与真正的浮点错误(硬件FPU设置一个 旗 每当它执行溢出的原子操作时),我们需要 自己实现整数溢出检测。 我们做 的 标量,而不是数组,因为实现起来太慢 对于 数组上的每个原子操作。

因此,您有责任选择适当的dtypes,以免任何操作溢出。

unutbu answered 2020-07-04T13:20:04Z
8 votes

解决此问题的一种简单方法是使用64位类型

list = numpy.array(list, dtype=numpy.float64)
Khaled answered 2020-07-04T13:20:24Z
translate from https://stackoverflow.com:/questions/7559595/python-runtimewarning-overflow-encountered-in-long-scalars