在本文中,我们将讨论如何在 Python 中修复 RuntimeWarning: overflow encountered in exp 错误。
当我们使用 NumPy 库的 exp() 函数对过大的数值进行计算时,通常会触发这个警告。该函数用于计算输入数组或元素(NumPy 的 0 维数组)中所有元素的指数值。
示例:展示该警告的代码
import numpy as np
print(np.exp(789))
输出:
输出结果为无穷大,这是因为 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))
输出:
使用 float128 的结果
对于 n 维数组(ndarray),我们可以利用数组方法的 dtype 参数。
示例:不使用 dtype 的程序
import numpy as np
cc = np.array([789, 0.34, -1234.1])
print(np.exp(cc))
输出:
未使用 dtype 的结果
示例:通过使用 dtype 修复警告
import numpy as np
cc = np.array([789, 0.34, -1234.1], dtype=np.float128)
print(np.exp(cc))
输出:
使用 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))
输出:
使用 filterwarnings() 的结果