HOWTO · NumPy

在 Python 的 numpy.exp()函式中遇到的溢位錯誤

瞭解如何在 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 文件此處