SciPy Tutorial¶
このガイドブックのチュートリアル “SciPy Tutorial” こそが言わば公式チュートリアル。 SciPy の機能を厳選して構成されたと思われるので、一通り読んでみたくなる。しかし、各章かなりの分量がある。テキストおよび画像がふんだんにあり、重い。自分の興味のあるトピックに絞ってまずは学習を進めたい。
Introduction¶
見出しのとおり、SciPy の紹介および導入手順の記述となっている。
SciPy は MATLAB, IDL, Octave, R-Lab, SciLab をライバルと位置づけている。
例の
import numpy as np等のインポート規約をしているのはここ。サブパッケージの構成と要約の表がある。
help,np.info,np.sourceがヘルプ三種の神器。infoはキーワード引数でテキストの書式を細かくコントロールできる。sourceはちょっと珍しい機能なので、初めて使うscipy配下の関数に対して、一度は試してみる価値あり。もしNot available for this object.というメッセージが出たら諦める。
Basic functions in Numpy (and top-level scipy)¶
Interaction with Numpy¶
モジュール
scipyのトップレベルはnumpyの関数をすべて含む。なのでa = scipy.arange(5)のようにも書けるが、そうはせずにa = np.arange(5)のように書くほうがよい。
Index Tricks¶
配列インスタンスを素早く作成するために、np.r_, np.c_, np.mgrid,
np.ogrid の使い方を習得する。
オブジェクト
np.r_は各配列を横に連結するのに使える。関数np.concatanateよりタイプしやすい。ステップ数を指示するのに、変な使い方で虚数 (
j) を与えることになる。同様に
np.c_は各配列を縦に(して横に)連結できる。N 次元配列を定義するのにオブジェクト
np.mgridを利用できる。拡張スライス記法が使える。np.ogridは使い途がわからない。ちょっと触っただけだが。
Shape manipulation¶
多次元配列を縦にしたり、横にしたり、分割したり、……といった操作をするルーチンを指す。
Polynomials¶
SciPy では多項式を取り扱う方法は二つある。両方の形式は相互に交換可能である。
クラス
np.lib.polynomial.poly1dで多項式オブジェクトを定義する。例えば:p.integで原始関数取得。キーワード引数kが定数項。p.deriveで導関数取得。p(arraylike)で評価。
単に配列で多項式の係数を表現するもの。この場合は降べきの順に係数を格納する。
Vectorizing functions (vectorize)¶
関数
vectorizeを使うと、スカラー引数を取りスカラー値を戻す関数funcから、array-like 版funcを新たに定義することができる。こんなものを使わなくても、最初からベクトルを引数に取ってベクトル値を返す関数を定義すればよい?いや、何らかの最適化の結果であったり、組み込み関数などは
vectorizeしないとベクトル化できまい。
Type handling¶
np.iscomplex/np.isrealは配列ベースで、要素ごとの判定。np.iscomplexobj/np.isrealobjはオブジェクトベースで、引数丸ごと全体の判定。実部・虚部の取得には関数形式の
np.real/np.imagを利用するとよい。戻り値が配列型になる。絶対値が極めて小さい場合は、関数
np.real_if_closeも考慮する。
スカラー性の判定には関数
np.isscalarを。型キャストには
np.castオブジェクトを。
Other useful functions¶
その他便利な機能を羅列している。
角度モノを取り扱うときは
angle,unwrapを当たってみる。等間隔に値を定義する場合は
linspaceが有用。対数版はlogspaceを。関数
selectは「複数版if文」みたいなもの。モジュール
scipy.miscには色々とある。階乗の計算には
factorial系関数(浮動小数点型ならばガンマ関数)で得られる。n 個から r 個を選ぶ組み合わせ、レイアウトの都合上高校数学風に書くと \(_n \mathrm{C} _r\) は
comb(n, r)で求まる。かの Lena の画像イメージを返す関数
lenaが存在する。
関数
central_diff_weightsとderivativeは関数の微分の近似に便利。
Special functions (scipy.special)¶
サブパッケージ
scipy.specialは数理物理学の特殊関数を提供する。他には低水準の統計関数もあるが、一般用途ではなくて
scipy.statsのためのもの。もし欲しい関数が当パッケージにない場合は、自分でそれを書いて当プロジェクトへ貢献することを考えて欲しいそうだ。
言語は Fortran でも C でも Python でも構わないそうだ。
あとは Bessel 関数群の紹介とプロットのサンプルを示している。
Integration (scipy.integrate)¶
数値積分および常微分方程式にまつわる技法を提供するサブパッケージ。
一変数関数の定積分は関数
quadを用いる。重積分には関数
dblquad,tplquad,nquadを用いる。Gauss 求積法なら
fixed_quad,quadratureを用いる。Romberg 求積法なら
romberg,rombを用いる。標本点がある場合は積分の方法がいくつかある。
等間隔かつ点の個数が 2 のなんとか乗プラス 1 ならば
rombが使える。任意の間隔の場合は
trapzとsimpsが使える。ただし、後者の Simpson 法については原理上、点の個数の偶奇性や、被積分関数が高次数の多項式の場合は求積値が正しく求められないことを断っている。
Python のモジュール
ctypesを利用することで、計算時間を短縮できるかもしれない。上等な話題なので本ノートでは割愛。一階ベクトル常微分方程式を解くのには関数
odeintを用いる。任意の階数の常微分方程式は、適宜変形して一階の形式に帰着させることで
odeintを用いる。計算効率を上げるためのオプション(キーワード)引数がたくさんある。例えば微係数を求める関数を引数
Dfunに指示するなど。
Optimization (scipy.optimize)¶
最適化アルゴリズムや一変数関数の根を求める計算機能等を提供するサブパッケージ。
See also
Interpolation (scipy.interpolate)¶
補間機能に関する機能を提供するサブパッケージ。ノートは別項 補間 で扱う。
一次元データの補間はクラス
interp1dを使う。関数
griddataは n 次元データの補間のインターフェイス。FITPACK (Fortran) によるスプライン補間機能。手続き型とオブジェクト指向型の両方のインターフェイスがある。
関数
splrep,splprep,splev, etc.: 一変数スプラインクラス
UnivariateSpline: 一変数スプライン関数
bisplrep,bisplev: 二変数スプラインクラス
BivariateSpline: 二変数スプライン
放射基底関数による散布データの補間機能。
クラス
Rbfクラス
UnivariateSpline
Fourier Transforms (scipy.fftpack)¶
高速フーリエ変換 (FFT)
関数
fft,iftt: 一次元データ用関数
fft2,iftt2: 二次元データ用関数
fftn,ifttn: n 次元データ用関数
convolve: ふたつの一次元配列の畳み込み。
離散コサイン変換は関数
dct,idctを用いる。離散サイン変換は関数
dst,idstを用いる。
Signal Processing (scipy.signal)¶
画像処理か。私には難解。
Linear Algebra (scipy.linalg)¶
線形代数に関する機能を提供するサブパッケージ。
sci.matを利用すると MATLAB 風表記で行列インスタンスを定義できる。行列
Aに対して、もし存在すれば逆行列はlinalg.inv(A)またはA.Iで得られる。線形方程式 \(Ax = b\) を
linalg.solve(A, b)で解くことができる(解が存在すれば)。Aの行列式はlinalg.detで求める。ノルムには関数
linalg.normを用いる。ノルムの種類を引数で指示する。最小二乗法には
linalg.lstsqを用いる。固有値・固有ベクトル、各種分解も可能。
行列のテイラー展開による各種関数もサポート。
See also
Sparse Eigenvalue Problems with ARPACK¶
サブパッケージ scipy.sparse.linalg の説明か。
ARPACK というのは Fortran のパッケージ。巨大な疎行列の固有値・固有ベクトルを素速く求めるルーチンを備えている。
高水準インターフェイスを擁する。
eigs: 非対称正方行列向け。eigsh: 実対称行列またはエルミート行列向け。
例題は「巨大な疎行列の最小と最大の固有値と対応する固有ベクトルを求める」ものなので、興味が出たら読む。
Compressed Sparse Graph Routines (scipy.sparse.csgraph)¶
マジカルバナナみたいなゲームを例題に、Dijkstra 法や連結成分を応用して解を求める。何だこのテキストは。
Spatial data structures and algorithms (scipy.spatial)¶
別ページ 空間データ構造 を参照。
Statistics (scipy.stats)¶
確率、統計の計算に関する機能を提供するサブパッケージ。ノートは別項 確率と統計 で扱う。
Multi-dimensional image processing (scipy.ndimage)¶
ここも画像処理か。読むのがキツイ。
File IO (scipy.io)¶
SciPy はある種のファイルフォーマットを操作できるということがわかる。MATLAB ファイルやら WAV ファイルやら。
Weave (scipy.weave)¶
Python コードの内部に C/C++ のコードを含めるためのサブモジュールだったが、 Python 3.x 以降では廃止された。