Python SciPy:ライブラリと関数の包括的チュートリアル
Python SciPy:ライブラリと関数の包括的チュートリアル
SciPyは、NumPyを拡張して数学、科学、工学、技術的問題を解決するツールを提供するオープンソースライブラリです。NumPyの上に構築され、データ操作と可視化のための幅広いハイレベルコマンドを提供します。
サブパッケージ
- scipy.io – MATLAB、NetCDF、CSVなど多形式のファイルI/O
- scipy.special – 特殊数学関数(ベッセル、ガンマなど)
- scipy.linalg – 線形代数ルーチン
- scipy.interpolate – 補間技術
- scipy.optimize – 最適化と曲線フィッティング
- scipy.stats – 統計分布と乱数生成
- scipy.integrate – 数値積分
- scipy.fftpack – 高速フーリエ変換
- scipy.signal – 信号処理
- scipy.ndimage – 多次元画像処理
このチュートリアルの内容:
- SciPyとは何か、なぜ重要か
- NumPyとSciPyの違い
- インストールと環境セットアップ
- コード例付き主要サブパッケージ
- 実用応用:線形代数、フーリエ変換、最適化、画像処理、数値積分
なぜSciPyを使うのか?
- GNU Scientific LibraryとMATLABに次ぐ包括的な科学ツールセット
- 使いやすく高速、NumPy配列と完全互換
- 学術界と産業界で広く採用され、堅牢なサポートとコミュニティ貢献
NumPy vs SciPy
NumPy
- C言語で書かれたPython高性能数値計算のコアライブラリ
- 配列オブジェクトと基本操作(ソート、形状変更、インデックス)を提供
- Pythonのすべての科学ライブラリの基盤
SciPy
- NumPyの上に構築され、特殊アルゴリズムで拡張
- 完全な線形代数スイート、最適化、統計などを含む
- 高度な科学ワークフローに不可欠
インストールと環境セットアップ
pipまたはシステムパッケージマネージャでSciPyをインストール:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
スクリプトでSciPyとNumPyをインポート:
from scipy import special import numpy as np
scipy.ioでのファイルI/O
MATLAB .matファイルの保存と読み込みが簡単:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
loaded = sio.loadmat('example.mat', struct_as_record=True)
print(loaded['ar'])
出力:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
特殊関数 – scipy.special
よく使われる特殊関数の例:
- 立方根:
scipy.special.cbrt(x)→cbrt([27, 64]) # [3., 4.] - 10x:
scipy.special.exp10(x)→exp10([1,10]) # [1.e+01 1.e+10] - 組み合わせ:
scipy.special.comb(N, k, exact=False, repetition=True)→comb(5, 2) # 15.0 - 順列:
scipy.special.perm(N, k, exact=True)→perm(5, 2) # 20 - LogSumExp:
scipy.special.logsumexp(x) - ベッセル関数J:
scipy.special.jn(n, x)
線形代数 – scipy.linalg
行列式、逆行列、固有値、固有ベクトルを計算:
from scipy import linalg import numpy as np A = np.array([[4,5],[3,2]]) print(linalg.det(A)) # -7.0 print(linalg.inv(A)) # 逆行列 vals, vecs = linalg.eig(A) print(vals) # 固有値 print(vecs) # 固有ベクトル
出力:
-7.0
array([[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]])
[ 9.+0.j -1.+0.j]
[[ 0.70710678 -0.5547002 ]
[ 0.70710678 0.83205029]]
離散フーリエ変換 – scipy.fftpack
正弦波を変換しスペクトルを可視化:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Time (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
最適化 – scipy.optimize
スカラ関数の最小値をBFGSとバスケットホッピングで探索:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('BFGS結果:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('バスケットホッピング結果:', min_basin.x)
出力はBFGSで見つかった局所的最小値と、バスケットホッピングで確認された大域的最適値を示します。
Nelder-Meadアルゴリズム
勾配情報なしのシンプルな無制約最小化:
from scipy.optimize import minimize
def f(x):
return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('結果:', res.x, '関数値:', res.fun)
画像処理 – scipy.ndimage
画像操作:表示、反転、回転、フィルタ適用。
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Flip Down')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotated 135°')
plt.show()
数値積分 – scipy.integrate
自動誤差推定付きの単一・二重積分:
from scipy import integrate
# 0から1までのx^2の単一積分
single = integrate.quad(lambda x: x**2, 0, 1)
print('単一積分:', single)
# 三角形領域上の64*x*yの二重積分
double = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
lambda x: 0,
lambda y: (1 - 2*y**2)**0.5)
print('二重積分:', double)
両方ともタプルを返す:(値, 推定誤差)。
まとめ
SciPyはNumPyを拡張し、線形代数、最適化、統計、信号処理、画像操作を含む完全な科学計算スタックを提供します。豊富なサブパッケージと堅牢なコミュニティサポートにより、研究者とエンジニアに不可欠です。
| パッケージ名 | 説明 |
|---|---|
| scipy.io | MATLAB、CSV、NetCDF等のファイル入出力 |
| scipy.special | 特殊数学関数(ベッセル、ガンマ等) |
| scipy.linalg | 高度な線形代数ルーチン |
| scipy.interpolate | 補間手法 |
| scipy.optimize | 最適化と曲線フィッティングツール |
| scipy.stats | 統計分布と乱数生成 |
| scipy.integrate | 数値積分(quad、dblquad等) |
| scipy.fftpack | 高速フーリエ変換 |
| scipy.signal | 信号処理ユーティリティ |
| scipy.ndimage | 多次元画像処理 |
Python
- Python print()関数の実践ガイド:基本から応用まで
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Pythonラムダ関数をマスターする:実例とベストプラクティス
- Python abs()関数:数値と複素数の絶対値を計算
- Python round()関数を実例で徹底解説
- Python map()関数をマスター:構文、例、ベストプラクティス
- Python timeit():実行時間測定の実例付きガイド
- Python yieldをマスター:ジェネレータvs return – 実践ガイド
- Python type()とisinstance()の理解:実例付き解説