如何修复:Python中遇到指数溢出的RuntimeWarning

在本文中,我们将讨论如何在 Python 中修复 RuntimeWarning: overflow encountered in exp 错误。

当我们使用 NumPy 库的 exp() 函数对过大的数值进行计算时,通常会触发这个警告。该函数用于计算输入数组或元素(NumPy 的 0 维数组)中所有元素的指数值。

示例:展示该警告的代码

import numpy as np

print(np.exp(789))

输出:

!image

输出结果为无穷大,这是因为 e^789 是一个非常大的数值。

之所以会出现这个警告,是因为 NumPy 中可用的最大数据类型是 float64,其最大范围是 1.7976931348623157e+308。对其取对数值后约为 709.782。对于任何大于此数值的输入,都会生成该警告。

让我们来探讨几种修复方法。

方法 1:使用 float128

我们可以将数据类型从 float64 更改为 float128。

示例:修复该警告的程序

import numpy as np

x = 789
x = np.float128(x)
print(np.exp(x))

输出:

!image

使用 float128 的结果

对于 n 维数组(ndarray),我们可以利用数组方法的 dtype 参数。

示例:不使用 dtype 的程序

import numpy as np

cc = np.array([789, 0.34, -1234.1])
print(np.exp(cc))

输出:

!image

未使用 dtype 的结果

示例:通过使用 dtype 修复警告

import numpy as np

cc = np.array([789, 0.34, -1234.1], dtype=np.float128)
print(np.exp(cc))

输出:

!image

使用 dtype 的结果

方法 2:使用 filterwarnings()

警告消息通常用于在程序中提醒用户注意某些情况,这些情况(通常)不需要引发异常并终止程序。为了处理警告,Python 提供了一个名为 warning 的内置模块。如果你想了解更多关于 Python 警告的信息,可以查看这篇文章

filterwarnings() 函数可用于控制程序中警告的行为。警告过滤器控制是忽略、显示警告,还是将其变为错误(引发异常)。我们可以通过不同的动作来实现这一点:

  • "ignore":从不打印匹配的警告
  • "error":将匹配的警告转为异常
  • "once":无论位置如何,仅打印第一次出现的匹配警告

语法:

> warnings.filterwarnings(action, message=‘‘, category=Warning, module=‘‘, lineno=0, append=False)

示例:使用 filterwarnings() 修复警告

import numpy as np
import warnings

# 抑制警告
warnings.filterwarnings(‘ignore‘)

x = 789
x = np.float128(x)
print(np.exp(x))

输出:

!image

使用 filterwarnings() 的结果

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/42955.html
点赞
0.00 平均评分 (0% 分数) - 0