Python运行时警告:在长标量中遇到溢出

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**

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

RuntimeWarning:在长\u标量中遇到溢出

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

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

它发生在如下附加过程中:

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
是dtype
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
,

与真正的浮点错误不同(硬件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位操作系统上都会溢出。