Python RuntimeWarning:长标量中遇到溢出

发布于 2024-12-06 11:33:12 字数 263 浏览 2 评论 0原文

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

运行时警告:long_scalars 中遇到溢出

有人可以详细说明这意味着什么以及我可以采取什么措施来解决这个问题吗?

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

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

SomeList.append(VeryLongFormula)

I am new to programming. In my latest Python 2.7 project I encountered the following:

RuntimeWarning: overflow encountered in long_scalars

Could someone please elaborate what this means and what I could do to fix that?

The code runs through, but I'm not sure if it is a good idea to just ignore the warning.

It happens during an append process like:

SomeList.append(VeryLongFormula)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人迟暮 2024-12-13 11:33:12

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

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,以免操作溢出。

Here's an example which issues the same warning:

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

yields

RuntimeWarning: overflow encountered in long_scalars

In the example above it happens because a is of dtype int32, and the maximim value storable in an int32 is 2**31-1. Since 10**10 > 2**32-1, the exponentiation results in a number that is bigger than that which can be stored in an int32.

Note that you can not rely on np.seterr(all='warn') to catch all overflow
errors in numpy. For example, on 32-bit NumPy

>>> np.multiply.reduce(np.arange(21)+1)
-1195114496

while on 64-bit NumPy:

>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848

Both fail without any warning, although it is also due to an overflow error. The correct answer is that 21! equals

In [47]: import math

In [48]: math.factorial(21)
Out[50]: 51090942171709440000L

According to numpy developer, Robert Kern,

Unlike true floating point errors (where the hardware FPU sets a
flag
whenever it does an atomic operation that overflows), we need to
implement the integer overflow detection ourselves. We do it on
the
scalars, but not arrays because it would be too slow to implement
for
every atomic operation on arrays.

So the burden is on you to choose appropriate dtypes so that no operation overflows.

脱离于你 2024-12-13 11:33:12

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

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

An easy way to overcome this problem is to use 64 bit type

my_list = numpy.array(my_list, dtype=numpy.float64)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文