Python の numpy.exp()関数で遭遇したオーバーフロー

Vaibhav Vaibhav 2022年4月14日
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 ドキュメントこちらを参照してください。

著者: 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.