我是编程新手,在我的最新Python 2.7项目中遇到了以下问题:
RuntimeWarning:long_scalars中遇到溢出
请问有人可以详细说明这意味着什么以及我该如何修复它吗?
代码可以正常运行,但我不确定是否明智地忽略此警告。
它发生在类似以下的附加过程中:
SomeList.append(VeryLongFormula)
我是编程新手,在我的最新Python 2.7项目中遇到了以下问题:
RuntimeWarning:long_scalars中遇到溢出
请问有人可以详细说明这意味着什么以及我该如何修复它吗?
代码可以正常运行,但我不确定是否明智地忽略此警告。
它发生在类似以下的附加过程中:
SomeList.append(VeryLongFormula)
以下是一个发出同样警告的示例:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
产生。RuntimeWarning: overflow encountered in long_scalars
在上面的示例中,发生这种情况是因为a
的数据类型是int32
,而在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
,以便没有任何操作会溢出。
dtype
。例如,在上面的示例中,您可以通过设置A = np.array([10], dtype='int64')
来避免溢出错误。 - unutbuAF = np.float64(AF)
,这样就消除了警告。 - timkadonp.multiply.reduce(np.arange(17)+1)
对我来说不是 -288522240
,而是你提到的大整数。这是机器相关的吗? - Zelphir Kaltstahlnp.multiply.reduce(np.arange(17)+1)
返回-288522240
(ideone演示),但在64位操作系统上,它返回正确的答案355687428096000
。我已经将上面的示例更改为np.multiply.reduce(np.arange(21)+1)
,它在32位和64位操作系统上都会溢出。 - unutbu克服这个问题的简单方法是使用64位类型
my_list = numpy.array(my_list, dtype=numpy.float64)