HOWTO · Python

Python でオイラー数を使う

Pythonでオイラー数を扱うために、math.e、math.exp()、numpy.exp()を正しく使います。

このページの内容

オイラー数の浮動小数点値が必要なら math.e、e を1つのスカラー指数で累乗するなら math.exp(x)、配列の各要素に同じ計算を行うなら numpy.exp(values) を使います。math モジュールは Python の標準ライブラリに含まれ、NumPy は配列処理用のオプション依存関係です。選択は入力の形と目的に基づくもので、普遍的な速度順位を示すものではありません。

通常 e と書くオイラー数は、自然対数の底です。Python はこれを2進浮動小数点値として保持するため、表示形式を変えても、後の計算で使われる値は変わりません。

定数が必要なら math.e を読む

math から e をインポートすると、定数を直接読み取れます。ラベルや数式、底の値を明示的に必要とする計算に便利です。出力は、テストした実行環境での通常の Python float 表現です。

from math import e

print(e)
2.718281828459045

書式設定は表示時だけ行います。たとえば f"{e:.5f}" は 2.71828 と表示しますが、保存された float の精度を高めるわけではありません。計算中は書式設定前の値を保持し、読者、ファイル、UI が特定の小数桁数を必要とするときだけ丸めてください。

1つのスカラー指数には math.exp() を使う

スカラー x に対して e の x 乗を計算するには math.exp(x) を使います。処理内容が明確で、Python のドキュメントでも math.e ** x と書くより一般に正確だと説明されています。math.expm1(x) は exp(x) - 1 という式専用の関連関数で、x が0に非常に近い場合の有効桁の損失を防ぎます。

import math

print(math.exp(3))
print(math.expm1(1e-16))
20.085536923187668
1e-16

1行目は e の3乗です。2行目は expm1 が返す小さな値を示します。math.exp(1e-16) から 1 を引く方法では、減算が完了する前に情報が丸められて失われることがあります。

math.exp() は Python の float の範囲に制限されます。十分に大きい有限の指数を渡すと OverflowError が発生するため、入力に上限がない可能性がある場合は、すべての指数を表現できると仮定せず、この境界を処理してください。

import math

try:
    math.exp(1000)
except OverflowError as error:
    print(type(error).__name__)
OverflowError

アプリケーションでオーバーフローが予想される場合は、入力範囲を検証するか、数学的表現を変更するか、分野に適した数値計算法を使います。例外を捕捉するのは意図した動作の一部である場合に有効ですが、予期しない入力エラーを隠してはいけません。

配列値には numpy.exp() を使う

numpy.exp() は要素ごとに処理するユニバーサル関数です。各指数に対応する結果が必要な場合は、配列に似たコレクションを渡します。NumPy がなければ、プロジェクトで通常使う依存関係ツールで先にインストールしてください。標準ライブラリの math モジュールには配列演算がありません。

import numpy as np

exponents = np.array([0.0, 1.0, 2.0])
print(np.exp(exponents))
[1.         2.71828183 7.3890561 ]

返される配列は入力と同じ形状で、各要素を e の指数として計算した値を含みます。1つのスカラーには math.exp()、配列として処理する場合には numpy.exp() を使います。NumPy はスカラーも受け取れますが、1回のスカラー計算だけのためにインポートする必要はありません。

入力に応じて方法を選ぶ

定数を読むには math.e、1つのスカラー指数には math.exp()、配列の要素ごとの計算には numpy.exp() を使います。0に近い値で結果が exp(x) - 1 になる場合は math.expm1() を使ってください。いずれも有限の浮動小数点値を扱う API なので、書式設定は表示だけに影響し、非常に大きな指数結果は float に収まらないことがあります。詳しくは公式の Python math ドキュメント と NumPy exp ドキュメント を参照してください。