SciPyとその仲間たち(NumPy, IPython など)の違いと関係

python でちょっとした信号処理をしたくて、存在だけは以前から知っていた numpy に手を出したので、関連パッケージなどをまともに調べてまとめました。(ある程度素人の主観が入っているので、鵜呑みにしないように)

SciPy

総本山: http://www.scipy.org/

語源は Science + Python で、発音は "Sigh Pie(サイパイ)"。

今日の記事で挙げる各種ソフトの組み合わせによって実現されている、Python ベースの数学・科学技術計算用ソフトウェアエコシステムの名称。つまり、個別のソフトではなく、その集合体による計算環境のこと。乱暴にざっくり言ってしまえば、「Mathmatica や Matlab に代わる環境を Python でつくろうプロジェクト」 が SciPy。

なお、SciPy のコアパッケージの1つに、後述の SciPy library があり、そちらを指して SciPy と言うことも多い(というか大抵そっち)ので文脈で判断を。

NumPy

Pytyon は緩い型付けの言語なので、単純な処理を多量のデータに対して施す、といった処理が遅い。例えば、配列の数値の合計を計算する場合、Python の配列にはどんなデータも置けるので、いちいち各要素が数値なのかどうか型チェックをし、必要なら変換し……といった処理が必要になる。これがC言語であれば、1ループがアセンブリ数命令ですむし、SSEなどのベクトル計算命令を使うこともでき、かなり高速に処理できる。

NumPyは、この「大量のデータの配列の処理」を高速に行えるようにするライブラリである。NumPy は ndarray という名の型の配列を作ることができる。この型でデータ配列をつくると、データ自体は裏で C 言語の世界で確保され、配列全体に対する合計・平均や、値の設定・四則演算、果ては、FFT計算など、先ほど弱いと説明した処理は、 C 言語の世界に閉じて行われるようになるため、C言語に引けを取らない計算速度が得られる。

NumPyでは、N次元配列に対して、四則演算や統計系の演算、sinやlogなどの算術演算が定義されているが、完全な一覧はリファレンスマニュアル参照

ドキュメント: https://docs.scipy.org/doc/numpy/reference/routines.html

SciPy library

前述の通り、NumPy は N次元配列に対する基本的な操作は提供してくれてはいるが、Matlab相当か、と言われるとそんなことは無い。例えば、FFT変換は NumPy でも提供してくれているが、B-spline 補完を計算したい、とか、インテグラルの計算をしたい、とかはサポートしてくれていない。

SciPy library は、はそのような数学・科学技術計算の関数の詰め合わせで、Matlab 相当まで引き上げるための補完のライブラリだと思えば良い。

NumPyで元から提供されている関数であっても、大抵、scipyのネームスペースからリンクが張られているので、「ちょっと複雑な計算がしたい」と思ったら、scipyのリファレンスから探して、それを使うのが良いだろう。

ドキュメント: http://scipy.github.io/devdocs/

matplotlib

名前の通り、データをプロットした画像を作成するライブラリ。
NumPy配列で計算した結果のデータをグラフ化したい、というのは当然よくある話なので、大抵組み合わせて使用される。

どんなグラフがかけるかは下記公式ギャラリーを参照

http://matplotlib.org/gallery.html

グラフ画像とそれを出力するコードがセットになっているので、見れば大体使い方はわかるだろう。

IPython

Pythonスクリプトを指定せずに起動すると、インタラクティブシェルを立ち上げることができるが、そんなにリッチなシェルではないので、Matlab のコンソールの置き換えとしては弱い。それを補完するのが IPython である。(つまり、IPython はアプリの名前であって、NumPy などのような Python モジュールというわけではない。)

IPython のシェルでは、タブ補完ができたり、動的に関数ヘルプが見れたり、matplotlibの結果表示も統合して表示できたりする。

特に Mathmatica Notebook のパクインスパイアな IPython notebook が便利で、Markupの文章や数式と、Pythonのコードやその出力を交ぜ書きし、記録に残して共有できる。詳細は以下の記事が詳しい

http://derivecv.tumblr.com/post/95686651704

SymPy

わかる人向けに一言でいうなら、「Matlab 担当が SciPy library なら、Mathmatica 担当が SymPy」といったところ。
NumPy や SciPy library は、前述の通り、数値配列(=離散的なデータ)を扱うものだが、SymPyでは symbol を定義して、数式を数式のまま扱うことができるため、理論上計算誤差は発生せず、微分積分を計算したり、連立方程式を解いたりすることもできる。

チュートリアル(イントロ部分): http://docs.sympy.org/latest/tutorial/intro.html

自分が興味があるのは数値計算のほうなので、SymPyのほうは積極的に使うことはないが、数学を忘れた頭には、微分を計算してくれるのはありがたいので、電卓としては使うかもしれない。

Pandas

numpy のデータ列に対して、SQLでやるような統計データ処理(WHERE で絞って GRUPE BY したものを SELECT SUM するみたいな)を行えるようにした便利ライブラリ。現実世界で収集したデータをCSVなどで取り込んできて処理するのが主な使い方だろう。

時間のフォーマットを解釈してくれるので「指定期間のデータを抜き出す」といったことができたり、「性別の項の値でグループ分けした時の、それぞれのグループの評価値の平均を求める」といったことができたりする。具体的にどんなことができるかは、中の人の下記の10分動画で紹介されている。

紹介動画: 10-minute tour of pandas on Vimeo

テーブルの結合や group by などは、SciPy library の処理結果に対して使えるシーンもあるかもしれない。(ぱっとは思いつかないが)

ほかには?

SciPy の公式サイトには、コアパッケージとして、上記や Python 自体の他、nose というテストフレームワークが挙げられている。

また、関連パッケージも鬼のような数が挙げられているが、 SciPy 自体が Python 畑ではない方面から流行っていることもあり、コアパッケージのみの素環境が主流のようだ。個人的には、使いやすいグラフ関連の補助ライブラリを探してみたいところ。