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

tim*_*ado 47 python scalar numpy append overflow

我是编程新手.在我最新的Python 2.7项目中,我遇到了以下内容:

RuntimeWarning:在long_scalars中遇到溢出

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

代码贯穿始终,但我不确定忽略警告是否是个好主意.

它发生在追加过程中,如:

SomeList.append(VeryLongFormula)
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 50

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

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

产量

RuntimeWarning: overflow encountered in long_scalars
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,它发生因为a是dtype int32,并且a中可存储的最大值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
Run Code Online (Sandbox Code Playgroud)

而在64位NumPy上:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
Run Code Online (Sandbox Code Playgroud)

两者都没有任何警告而失败,尽管它也是由于溢出错误造成的.正确答案是21!等于

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
Run Code Online (Sandbox Code Playgroud)

根据numpy开发人员Robert Kern的说法,

与真正的浮点错误(硬件FPU在进行溢出的原子操作时设置标志)不同,我们需要自己实现整数溢出检测.我们在标量上做,但不是数组,因为对于数组上的每个原子操作来说实现起来太慢了.

因此,您需要选择合适的负担,dtypes以免任何操作溢出.

  • 您可以在创建numpy数组时设置`dtype`.例如,在上面的示例中,您可以通过设置来避免溢出错误:`A = np.array([10],dtype ='int64')` (4认同)
  • 谢谢!如何定义我想要的dtype? (2认同)
  • 这是[基本dtypes列表](http://docs.scipy.org/doc/numpy/user/basics.types.html#data-types). (2认同)
  • 非常感谢你!!!我将变量AF和RT转换为float64:`AF = np.float64(AF)`并且警告消失了. (2认同)
  • @Zelphir:感谢您指出这一点。你是对的——在 32 位操作系统上,`np.multiply.reduce(np.arange(17)+1)` 返回 `-288522240` ([ideone demo](http://ideone.com/tfUbow)) ,但在 64 位操作系统上,它返回正确答案,`355687428096000`。我将上面帖子中的示例更改为 `np.multiply.reduce(np.arange(21)+1)`,它会在 32 位和 64 位操作系统上溢出。 (2认同)

小智 8

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

list = numpy.array(list, dtype=numpy.float64)
Run Code Online (Sandbox Code Playgroud)