【问题标题】:Python RuntimeWarning: overflow encountered in long scalarsPython RuntimeWarning:长标量中遇到溢出
【发布时间】:2011-11-25 10:52:22
【问题描述】:

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

RuntimeWarning:long_scalars 中遇到溢出

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

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

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

SomeList.append(VeryLongFormula)

【问题讨论】:

标签: python numpy append overflow scalar


【解决方案1】:

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

list = numpy.array(list, dtype=numpy.float64)

【讨论】:

    【解决方案2】:

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

    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
    

    According to numpy developer, Robert Kern,

    不同于真正的浮点错误(硬件 FPU 设置一个 旗帜 每当它执行溢出的原子操作时),我们需要 自己实现整数溢出检测。我们这样做 这 标量,但不是数组,因为实现起来太慢了 为了 数组上的每个原子操作。

    因此,您有责任选择合适的dtypes,以免操作溢出。

    【讨论】:

    • 谢谢!如何定义我想要的 dtype?
    • 创建numpy数组时可以设置dtype。例如,在我上面的例子中,你可以通过设置来避免溢出错误:A = np.array([10],dtype='int64')
    • 非常感谢!!!我将变量 AF 和 RT 转换为 float64:AF = np.float64(AF),警告消失了。
    • @Zelphir:感谢您指出这一点。你是对的——在 32 位操作系统上,np.multiply.reduce(np.arange(17)+1) 返回 -288522240 (ideone demo),但在 64 位操作系统上,它返回正确答案 355687428096000。我将上面帖子中的示例更改为np.multiply.reduce(np.arange(21)+1),它在 32 位和 64 位操作系统上都会溢出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多