はじめに =============================== 本章までに,Pythonで簡単な解析やプログラムの構築は出来るようになりました. 次にみなさんが行いたいのは,実験データの解析やシミュレーションでしょう. そこで,Pythonにおける科学技術計算の基礎ライブラリであるNumPyの使い方を,実際の実験データを解析しながら紹介します. 更に,高度な数学的アルゴリズムを提供するSciPyに関する簡単な紹介とともに,シミュレーションの例としてPredator-Preyモデルの簡単な解析例を示します. 本章で興味を持たれた方は,NumPy/SciPyに関する情報は公式HP [NP]_ [SP]_ や,近年充実してきている日本語書籍 [WM]_ [KN]_ を参考にして,より理解を深めていただければと思います. ------------------------------------ NumPy/SciPyとは ------------------------------------ NumPy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NumPyは”Numerical Python”の略語で,科学技術計算やデータ分析のための基本的なパッケージです. Pythonは一般に,CやFortran等のコンパイラー型言語と比較して性能が犠牲になっています. そこでNumPyでは多次元配列 ndarray をC言語で実装することで 使い勝手の良いインターフェイスを提供しつつも高速な演算を実現しています. 特に,配列のデータをシステムのメモリ(RAM)に隙間なく配置することで以下のような理由により高速化することができています. + データをCPUレジスタにまとめて効率的に読み出せる + スライス,転置などの操作を実際にデータをコピーせずに実現できる + CPUのベクトル化演算の恩恵を受けられる SciPy ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SciPyはNumPyを利用するパッケージであり, 高速フーリエ変換,最適化,数値積分,信号処理などの科学技術計算に関する機能を提供しています. SciPyでは,Fortranのプログラムで実装された多くの関数群を提供しており, Pythonのスクリプト言語としての機能を大幅に強化しています. このおかげで,Pythonが科学技術計算においてMATLAB, IDL, Octave,及びScilabに匹敵するシステムになっています. SciPyは,以下の表に示すような多くのサブパッケージ群から構成されています. +-------------+----------------------------------------------+ | cluster | ベクトル量子化/K平均法 | +-------------+----------------------------------------------+ | constants | 物理/数学定数 | +-------------+----------------------------------------------+ | fftpack | FFTの関数 | +-------------+----------------------------------------------+ | integrate | 積分と常微分方程式ソルバー | +-------------+----------------------------------------------+ | interpolate | 内挿とスムージングスプライン | +-------------+----------------------------------------------+ | io | データ入出力 | +-------------+----------------------------------------------+ | linalg | 線形代数ルーチン | +-------------+----------------------------------------------+ | ndimage | N次元画像パッケージ | +-------------+----------------------------------------------+ | odr | 直交距離回帰(Orthogonal Distance Regression) | +-------------+----------------------------------------------+ | optimize | 最適化及び解探索ルーチン | +-------------+----------------------------------------------+ | signal | 信号処理 | +-------------+----------------------------------------------+ | sparse | 疎行列と関連する関数 | +-------------+----------------------------------------------+ | spatial | 空間データ構造とアルゴリズム | +-------------+----------------------------------------------+ | special | 任意の数学特殊関数 | +-------------+----------------------------------------------+ | stats | 統計分布,統計関数 | +-------------+----------------------------------------------+ | weave | C/C++統合 | +-------------+----------------------------------------------+ これらの機能を全て紹介することはできませんが,SciPyの公式ドキュメント [SP]_ を閲覧するか,Pythonのインタラクティブシェルでヘルプを表示させることで詳細を調べることができます [#]_ . NumPyとSciPyの関係 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SciPyのDocstringの冒頭には,「SciPyはNumPyの名前空間から全ての関数をimportし,加えて以下のサブパッケージを提供する」ということが書かれています. つまり,SciPyをimportすると,基本的に全てのNumPy関数を使えるようになります. ただし,SciPyの関数はNumPyの同一関数よりも最適化されていたり,機能が拡張されている場合が多いため,両者に関数が存在する場合には, SciPyにしか存在しない関数を用いるほうが計算速度の面で有利なことが多いです. ------------------------------------ NumPy/SciPyの利用 ------------------------------------ それでは早速,NumPy/SciPyを使っていきましょう. 1章を参考にanacondaを使ってPythonをインストールした人は既にNumPyは入っていると思います. そこで,まずはNumPy/SciPyの有無を確認してみます. Pythonコンソールで .. ipython:: python import numpy import scipy と打ってみてエラーがなければ無事にインストールされています. ``No Module Named numpy`` のようなエラーが出る場合はターミナルで以下のコマンドを入れてインストールして下さい [#]_ . .. code-block:: bash $ conda install numpy $ conda install scipy .. pip install numpy .. pip install scipy NumPyのインストールが完了したら,プログラム中で使用するためにimportを行います. 外部パッケージの使用に関する詳細は2章を参照してください. NumPyをimportするには,プログラム冒頭で以下のように宣言します. .. ipython:: python import numpy from numpy import * ``from モジュール名 import *`` というコードは,既にスコープに存在する変数を知らない間に上書きしてしまう恐れがあります. そのため,本章ではNumPyの呼び出しは .. ipython:: python import numpy as np import scipy as sp に統一してあります. 読者の皆さんにも ``np.関数名`` での呼び出し記法を強く推奨します. .. [NP] http://www.numpy.org .. [SP] https://www.scipy.org .. [WM] Wes McKinney: 「Pythonによるデータ分析入門」(オライリー・ジャパン,2013) .. [KN] 中久喜健司: 「科学技術計算のためのPython入門」(技術評論社,2016) .. [#] たとえばscipy.linalgのヘルプを表示させたい場合は,IPythonなどで ``>>> scipy.linalg?`` と入力すればヘルプを参照することができます. .. [#] ``$ pip install numpy`` や ``$ pip install scipy`` でもインストールはできますが,condaを使うとIntel製の高性能行列ライブラリMKLが使えるようになるため,自動的に全てのコアを使って計算してくれるようになります.