在 Python 的 numpy.exp()函数中遇到的溢出错误

Vaibhav Vaibhav 2022年5月13日
在 Python 的 numpy.exp()函数中遇到的溢出错误

NumPy 是一个 Python 包,其中包含丰富的实用程序,可用于处理大型多维矩阵和数组,并对它们执行复杂和直接的数学运算。

这些实用程序对输入是动态的,并且高度优化和快速。NumPy 包有一个函数 exp() 计算输入 numpy 数组的所有元素的指数。

换句话说,它计算 exx 是输入 numpy 数组的每个数字,e 是大约等于 2.71828 的欧拉数。

由于此计算可能会产生巨大的数字,因此某些数据类型无法处理如此大的值,因此,此函数将返回 inf 和错误而不是有效的浮点值。

例如,对于 numpy.exp(709),此函数将返回 8.21840746e+307,但对于 numpy.exp(710),将返回 runtimeWarning:exp inf 中遇到溢出

在本文中,我们将学习如何解决此问题。

修复 Python NumPy 中 numpy.exp() 函数中的溢出问题

我们必须将值存储在能够保存如此大值的数据类型中以解决此问题。

例如,np.float128 可以容纳比 float64float32 更大的数字。我们所要做的只是将数组的每个值类型转换为更大的数据类型并将其存储在一个 numpy 数组中。

下面的 Python 代码描述了这一点。

import numpy as np

a = np.array([1223, 2563, 3266, 709, 710], dtype=np.float128)
print(np.exp(a))

输出:

[1.38723925e+0531 1.24956001e+1113 2.54552810e+1418 8.21840746e+0307
 2.23399477e+0308]

尽管上面的 Python 代码可以无缝运行,没有任何问题,但我们仍然容易出现同样的错误。

背后的原因很简单;甚至 np.float128 也有它可以容纳的数字的阈值。每种数据类型都有一个上限,如果超过了上限,事情就会开始出现问题,程序就会开始出现溢出错误。

要理解上面提到的点,请参考下面的 Python 代码。尽管 np.float128 在最后一个 Python 代码片段中解决了我们的问题,但它不适用于更大的值。

import numpy as np

a = np.array([1223324, 25636563, 32342266, 235350239, 27516346320], dtype=np.float128)
print(np.exp(a))

输出:

<string>:4: RuntimeWarning: overflow encountered in exp
[inf inf inf inf inf]

exp() 函数为 numpy 数组中的每个值返回一个无穷大。

要了解 numpy.exp() 函数,请参阅官方 NumPy 文档此处

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.