Pythonで数値計算をするとき、「どのライブラリを使えばいいのか」で迷ったことはないだろうか。簡単な計算なら標準ライブラリで十分だし、大量のデータを扱うならNumPyが必要になる。金額計算で浮動小数点の罠にはまった経験がある人も多いはずだ。
この記事では、Python の数値計算ライブラリを 標準ライブラリ4つ + 外部ライブラリ4つ の計8つ紹介する。それぞれの強みと使いどころを、実際のコード例とともに解説していく。
早見表 ── どれを使うべきか
まずは全体像を掴もう。ライブラリ名をクリックすると詳細に飛べる。
| ライブラリ | 種別 | ひとことで言うと | 使う場面 |
|---|---|---|---|
| math | 標準 | 基本数学関数 | 平方根・三角関数・対数など軽い計算 |
| statistics | 標準 | 軽量統計処理 | 平均・中央値・標準偏差をサッと出す |
| decimal | 標準 | 高精度小数 | 金額計算・税計算など誤差が許されない処理 |
| fractions | 標準 | 分数計算 | 比率や配分を正確に保持したい場合 |
| NumPy | 外部 | 高速配列計算 | 大量データの一括処理・AI前処理 |
| SymPy | 外部 | 数式操作 | 微分・積分・方程式を式のまま扱う |
| SciPy | 外部 | 科学技術計算 | 最適化・数値解法・信号処理 |
| Pint | 外部 | 単位付き計算 | 物理量の単位変換・単位ミス防止 |
では、それぞれ詳しく見ていこう。
標準ライブラリ編
まずはインストール不要、import するだけで使える4つから。小さなスクリプトやCLIツールでは、これらだけで十分なことが多い。
math ── 数値計算の出発点
Pythonで数値計算といえば、最初に触れるのがこの math モジュールだ。平方根、三角関数、対数といった基本的な数学関数が揃っている。
import math
distance = math.sqrt(3**2 + 4**2)
angle = math.sin(math.radians(30))
log_val = math.log10(1000)
print(distance) # 5.0
print(angle) # 0.49999999999999994
print(log_val) # 3.0
NumPyを持ち出すまでもない計算 ── 距離の算出、角度の変換、対数のちょっとした計算 ── ではこれが最適解になる。外部依存ゼロなので、CLIツールやWeb APIのバックエンドなど、環境を軽く保ちたい場面で重宝する。
逆に、配列に対して一括で計算したくなったら、それはNumPyへの移行サインだ。
statistics ── pandas を入れるほどではない時に
ログの平均応答時間を出したい。テスト結果のばらつきを確認したい。そんな「ちょっとした集計」に最適なのが statistics モジュールだ。
import statistics
response_times = [120, 180, 250, 300, 420]
print(statistics.mean(response_times)) # 254.0
print(statistics.median(response_times)) # 250
print(statistics.stdev(response_times)) # 112.07...
pandas を入れるほどの分析ではないが、sum() / len() で平均を出すのも味気ない ── そういう隙間にぴったりはまる。ログ解析スクリプト、CI結果の集計、品質チェックの簡易レポートなど、「分析」というほどではない数値集計で活躍する。
もう一つの利点は、statistics.mode() で最頻値、statistics.quantiles() で四分位数も出せること。データの偏りを手早くチェックしたい場面では、わざわざ pandas を引っ張ってくるより圧倒的に手軽だ。
decimal ── 浮動小数点の罠を回避する
Pythonの float で計算すると、こんなことが起きる。
print(0.1 + 0.2) # 0.30000000000000004
趣味のスクリプトなら無視できるが、金額計算でこれが出ると事故になる。decimal モジュールはこの問題を根本から解決する。
from decimal import Decimal
price = Decimal("19.99")
tax_rate = Decimal("0.10")
total = price * (1 + tax_rate)
print(total) # 21.989
最大の注意点は「必ず文字列で初期化する」こと。 Decimal(0.1) と書くと、float の誤差がそのまま持ち込まれる。Decimal("0.1") が正しい。このルールさえ守れば、税計算、割引計算、会計処理などで安心して使える。
fractions ── 小数にしたくない場面で
「2/5 + 1/10 は 1/2」── これを小数を経由せず、分数のまま正確に計算したい場面がある。配分ロジックや比率管理など、割合を正確に保持する必要がある場合に fractions が役立つ。
from fractions import Fraction
ratio = Fraction(2, 5) + Fraction(1, 10)
print(ratio) # 1/2
print(float(ratio)) # 0.5
頻繁に使うライブラリではないが、必要な場面 ── 配分計算、正確な比率処理、教育用途 ── では代替が効かない存在だ。金融系では decimal と併用されることもある。
実務での具体例を挙げると、レシピの分量を1/3にスケールしたり、株式の持分比率を正確に管理したりする場面がある。小数変換による丸め誤差を「仕様上許容できない」ケースでは、このライブラリが唯一の選択肢になる。
外部ライブラリ編
ここからは pip install が必要な外部ライブラリだ。標準ライブラリでは対応しきれない規模や専門性が求められる場面で登場する。
NumPy ── 数値計算の事実上の標準
Pythonの数値計算で最も広く使われているライブラリ。配列(ndarray)を使った高速な一括計算が最大の特徴で、AI・データ分析・科学計算のほぼ全ての分野で基盤となっている。
import numpy as np
data = np.array([5, 10, 15, 20])
# for文を書かずに全要素を一括処理
normalized = data / data.max()
print(normalized) # [0.25 0.5 0.75 1. ]
# 統計もワンライナー
print(np.mean(data)) # 12.5
print(np.std(data)) # 5.59...
NumPy の本質は 「for文を書かない計算」 だ。Pythonの for ループで1要素ずつ処理するより、NumPyの配列演算は桁違いに速い。データが数百件を超えたあたりから、その差を体感できるようになる。
AI・機械学習に進む場合はもちろん、大量のログ処理やバッチ計算でも必須になる。Python入門を終えたら、次に覚えるべきライブラリの筆頭だ。
SymPy ── 数式をそのまま操作する
他のライブラリが「数値」を計算するのに対し、SymPy は 「数式」を操作する。微分、積分、方程式の解法を、手計算と同じように式のまま扱える。
import sympy as sp
x = sp.symbols('x')
expr = x**3 - x
# 微分
print(sp.diff(expr)) # 3*x**2 - 1
# 方程式を解く
print(sp.solve(expr, x)) # [-1, 0, 1]
通常の開発で使う場面は限られるが、数式入力ツールの裏側、教育システム、計算サイトの構築など、数学的な処理をプログラムで自動化したい場面で威力を発揮する。このサイトの計算ツールのような用途とも相性が良い。
意外な使い道として、ユニットテストで「数学的に正しい期待値」を生成するのにも使える。手計算で検算する代わりに SymPy で式を解かせ、その結果をテストの expected value にする ── 正確さと効率を両立できるアプローチだ。
SciPy ── NumPy の先にある科学計算
NumPy が配列計算の基盤なら、SciPy はその上に構築された科学技術計算のツールキットだ。最適化、数値積分、信号処理、統計検定など、専門的な計算機能を提供する。
from scipy.optimize import minimize
# x^2 + 3x + 2 の最小値を数値的に探す
result = minimize(lambda x: x**2 + 3*x + 2, x0=0)
print(result.x[0]) # -1.5
print(result.fun) # -0.25
研究用途のイメージが強いが、実務でも「パラメータの最適値を見つけたい」「関数の根を求めたい」といった場面で登場する。AIのハイパーパラメータ調整やシミュレーションの裏側でも、SciPy の最適化関数が使われていることは多い。
NumPy との住み分けはシンプルで、「配列の四則演算や統計値」なら NumPy、「方程式を解く・最適化する・補間する」なら SciPy だ。両者はセットで使うことが多く、SciPy の関数は内部で NumPy 配列を前提としている。
Pint ── 単位ミスをゼロにする
人間は単位ミスをよく起こす。mm と m を取り違える、m/s と km/h を混同する ── こうしたミスをライブラリレベルで防ぐのが Pint だ。
from pint import UnitRegistry
ureg = UnitRegistry()
distance = 120 * ureg.kilometer
time = 2 * ureg.hour
speed = distance / time
print(speed) # 60.0 kilometer / hour
print(speed.to('m/s')) # 16.666... meter / second
物理計算、工学設計、単位変換を含むあらゆる場面で、コードの安全性を一段引き上げてくれる。特に複数人で開発するプロジェクトでは、「この変数の単位は何?」という曖昧さを排除できるメリットが大きい。
実際に単位ミスが引き起こした有名な事故として、1999年のNASA火星探査機の喪失がある。原因はポンド秒とニュートン秒の取り違えだった。Pint を使えば、異なる単位同士の演算で自動的に変換が行われるため、こうしたヒューマンエラーをコードレベルで防げる。
まとめ ── 選び方の指針
迷ったときの判断基準はシンプルだ。
- pip install なしで済ませたい → math, statistics, decimal, fractions
- 大量データを高速に処理したい → NumPy(+ 科学計算なら SciPy)
- 数式を式のまま扱いたい → SymPy
- 金額を正確に計算したい → decimal
- 単位付きの物理量を扱いたい → Pint
小さく始めて、必要になったら大きなライブラリに移行する。この流れを意識するだけで、依存関係を最小限に保ちながら、適切なツールを選べるようになる。
エラー処理の基本を押さえたい方は「Python エラー処理パターン7選」も参考にしてほしい。

コメントを残す