Python の numpy.exp()関数で遭遇したオーバーフロー
NumPy
は Python パッケージであり、大規模な多次元行列や配列を操作し、それらに対して複雑で単純な数学演算を実行するためのユーティリティが豊富に用意されています。
これらのユーティリティは入力に対して動的であり、高度に最適化されており、高速です。NumPy
パッケージには、入力 numpy 配列のすべての要素の指数を計算する関数 exp()
があります。
つまり、exを計算し、x
は入力 numpy 配列のすべての数であり、e
はオイラーの数であり、2.71828
にほぼ等しくなります。
この計算では膨大な数になる可能性があるため、一部のデータ型はそのような大きな値を処理できません。したがって、この関数は有効な浮動小数点値の代わりに inf
とエラーを返します。
たとえば、この関数は、numpy.exp(709)
の場合は 8.21840746e+307
を返しますが、numpy.exp(710)
の場合は runtimeWarning:expinf でオーバーフローが発生しました
を返します。
この記事では、この問題を修正する方法を学びます。
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
ドキュメントこちらを参照してください。