在 Python 的 numpy.exp()函数中遇到的溢出错误
NumPy
是一个 Python 包,其中包含丰富的实用程序,可用于处理大型多维矩阵和数组,并对它们执行复杂和直接的数学运算。
这些实用程序对输入是动态的,并且高度优化和快速。NumPy
包有一个函数 exp()
计算输入 numpy 数组的所有元素的指数。
换句话说,它计算 ex,x
是输入 numpy 数组的每个数字,e
是大约等于 2.71828
的欧拉数。
由于此计算可能会产生巨大的数字,因此某些数据类型无法处理如此大的值,因此,此函数将返回 inf
和错误而不是有效的浮点值。
例如,对于 numpy.exp(709)
,此函数将返回 8.21840746e+307
,但对于 numpy.exp(710)
,将返回 runtimeWarning:exp inf 中遇到溢出
。
在本文中,我们将学习如何解决此问题。
修复 Python NumPy 中 numpy.exp()
函数中的溢出问题
我们必须将值存储在能够保存如此大值的数据类型中以解决此问题。
例如,np.float128
可以容纳比 float64
和 float32
更大的数字。我们所要做的只是将数组的每个值类型转换为更大的数据类型并将其存储在一个 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
文档此处。