Scipy(サイパイ)は、科学技術計算用のPythonライブラリであり、数学、科学、エンジニアリング分野で幅広い機能があります。
ここでは、PythonにおけるSciPyを用いたデータ操作方法について解説しています。
この記事の対象
SciPyとは
SciPyとはNumPyの拡張機能を基に構築されている科学計算を行うためのライブラリです。
特徴としては信号処理、遺伝的アルゴリズム、フーリエ変換等の工学系の科学計算が容易にできる点です。
SciPyのインストール
SciPyを使用する前には、NumPyも入れておく必要があります。NumPyを基にSciPyが構築されているためです。また、SciPyはmatplotlibと一緒に使用される場合があるのでこちらも入れておきましょう。
$ pip install numpy
NumPyのインストールです。
$ pip install matplotlib
matplotlibのインストールです。
$ pip install scipy
SciPyのインストールです。
SciPyを用いた使用例
scipy.constants – 物理定数の利用
import scipy.constants as const
print(const.c) # 光速
print(const.G) # 重力定数
#299792458.0
#6.6743e-11
物理定数を利用する際に便利なモジュールです。
scipy.linalg – 線形代数の機能
import numpy as np
import scipy.linalg
A = np.array([[1, 2], [3, 4]])
B = scipy.linalg.inv(A) # 逆行列の計算
print(A)
print(B)
「scipy.linalg」では、行列の操作や線形代数の演算が可能です。
[[1 2]
[3 4]]
[[-2. 1. ]
[ 1.5 -0.5]]
scipy.stats – 確率統計
import scipy.stats
data = [1, 2, 2, 3, 3, 3, 4, 4, 5]
mean = scipy.stats.gmean(data)
std = scipy.stats.gstd(data)
print(mean)
print(std)
「scipy.stats」は統計解析に関する演算が可能です。
2.7377287445670455
1.6252408862789067
scipy.integrate – 積分
import numpy as np
import scipy.integrate
def func(x):
return x**2
result, error = scipy.integrate.quad(func, 0, 2)
print(result)
「scipy.integrate」は数値積分を行う機能です。関数func(x)を区間[0, 2]で数値積分しています。quad()関数は積分の結果と誤差の推定値を返しています。resultには積分の結果が、errorには誤差が格納されています。
2.666666666666667
scipy.signal – 信号処理
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
#1---パルスの生成
sig = np.repeat([0., 1., 0.], 100)
win = signal.windows.hann(100)
#2---2つのN次元配列を畳み込み
filtered = signal.convolve(sig, win, mode='same') / sum(win)
#3---グラフ化
fig, (ax_orig,ax_win,ax_filt) = plt.subplots(3, 1, sharex=True)
ax_orig.plot(sig)
ax_orig.set_title('pulse')
ax_orig.margins(0, 0.1)
ax_win.plot(win)
ax_win.set_title('pulse2')
ax_win.margins(0, 0.1)
ax_filt.plot(filtered)
ax_filt.set_title('Filtered signal')
ax_filt.margins(0, 0.1)
fig.tight_layout()
fig.savefig("plot.png")
上記がプログラムになります。このプログラムはSciPyサイトの「scipy.signal.convolve」のサンプルコードになります。
それでは解説していきます。
#1---パルスの生成
sig = np.repeat([0., 1., 0.], 100)
win = signal.windows.hann(100)
1の部分ではパルスを生成しています。最初に0、1を100回繰り返したものを生成しています。
次にハン窓を生成しています。詳しい解説はこちらを参照下さい。
#2---2つのN次元配列を畳み込み
filtered = signal.convolve(sig, win, mode='same') / sum(win)
2の部分では2つのN次元配列を畳み込みしています。「scipy.signal.convolve(in1, in2, mode=’full’, method=’auto’)」引数はそれぞれ、in1が最初の入力。in2が2番目の入力。 in1と同じ次元数である必要があります。modeが出力のサイズを示す文字列になります。
詳しい解説は公式サイトを覗いて下さい。
#3---グラフ化
fig, (ax_orig,ax_win,ax_filt) = plt.subplots(3, 1, sharex=True)
3の部分ではmatplotlibでグラフ化しています。
グラフ化しているものは元のパルス、インパルス応答フィルタ、フィルタリング信号になります。
fig.savefig("plot.png")
最後に画像として保存しています。
結果
フィルタされた信号が出力されていることが確認できました。
SciPyには様々なライブラリがあり、簡単に計算を行うことができるので便利です。
SciPyの便利なライブラリ一覧
項目 | 内容 |
constants | 物理定数と変換係数 |
cluster | 階層的クラスタリング、ベクトル量子化、K平均 |
fftpack | 離散フーリエ変換アルゴリズム |
integrate | 数値積分ルーチン |
interpolate | 補間ツール |
io | データ入出力 |
linalg | 線形代数ルーチン |
misc | その他(例:画像操作) |
ndimage | 多次元画像処理のためのさまざまな機能 |
optimize | 線形計画法を含む最適化アルゴリズム |
signal | 信号処理ツール |
sparse | スパース行列と関連アルゴリズム |
spatial | KD木、最近傍、距離関数 |
special | 特別な機能 |
stats | 統計関数 |
様々な便利なライブラリがあることが分かります。Scipyは多くの機能を提供しており、科学技術計算のさまざまな側面で活用できます。ScipyはNumPyと組み合わせて使用することで、より高度な計算や分析を行うのに役立つおすすめのライブラリです。