Python运行时警告:在长标量中遇到溢出
我是编程新手。在我最新的Python 2.7项目中,我遇到了以下问题: RuntimeWarning:在长\u标量中遇到溢出 有人能详细说明这意味着什么,我能做些什么来解决这个问题吗 代码可以运行,但我不确定忽略警告是否是个好主意 它发生在如下附加过程中:Python运行时警告:在长标量中遇到溢出,python,numpy,append,overflow,scalar,Python,Numpy,Append,Overflow,Scalar,我是编程新手。在我最新的Python 2.7项目中,我遇到了以下问题: RuntimeWarning:在长\u标量中遇到溢出 有人能详细说明这意味着什么,我能做些什么来解决这个问题吗 代码可以运行,但我不确定忽略警告是否是个好主意 它发生在如下附加过程中: SomeList.append(VeryLongFormula) 下面是一个发出相同警告的示例: import numpy as np np.seterr(all='warn') A = np.array([10]) a=A[-1] a**
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
是dtypeint32
,并且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
,
与真正的浮点错误不同(硬件FPU设置
旗帜
无论何时它执行原子操作(溢出),我们都需要
我们自己实现整数溢出检测。我们是在星期天做的
这个
标量,但不是数组,因为实现起来太慢
对于
数组上的每个原子操作
因此,选择合适的
d类型
是您的负担,这样就不会有操作溢出。克服此问题的简单方法是使用64位类型
list = numpy.array(list, dtype=numpy.float64)
请出示一个演示此问题的标签好吗?您包括了numpy标签。你的问题中没有任何东西表明你是努比。您没有包含允许我们重现错误的代码。请这样做。可能重复的谢谢!如何定义所需的数据类型?您可以在创建numpy数组时设置
dtype
。例如,在我上面的示例中,您可以通过设置来避免溢出错误:A=np.array([10],dtype='int64')
这里是一个。非常感谢!!!我将变量AF和RT转换成float64:AF=np.float64(AF)
,警告消失了。@Zelphir:谢谢你指出这一点。您是正确的--在32位操作系统上,np.multiply.reduce(np.arange(17)+1)
返回-28852240
(),但在64位操作系统上,它返回正确答案,355687428096000
。我将上面帖子中的示例更改为np.multiply.reduce(np.arange(21)+1)
,它在32位和64位操作系统上都会溢出。