小编典典

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

python

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

RuntimeWarning:long_scalars中遇到溢出

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

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

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

SomeList.append(VeryLongFormula)

阅读 379

收藏
2020-12-20

共1个答案

小编典典

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

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

产量

RuntimeWarning: overflow encountered in long_scalars

在上面的示例中,它的发生是因为的类型a是dtype int32,并且在an中可存储的最大值int32是2 ** 31-1。由于10**10 > 2**32-1,求幂导致的数字大于可以存储在int32

请注意,您不能依赖于np.seterr(all='warn')在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这样就不会出现任何操作溢出的情况。

2020-12-20