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 では多項式を取り扱う方法は二つある。両方の形式は相互に交換可能である。

  1. クラス np.lib.polynomial.poly1d で多項式オブジェクトを定義する。例えば:

    • p.integ で原始関数取得。キーワード引数 k が定数項。

    • p.derive で導関数取得。

    • p(arraylike) で評価。

  2. 単に配列で多項式の係数を表現するもの。この場合は降べきの順に係数を格納する。

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_weightsderivative は関数の微分の近似に便利。

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 が使える。

    • 任意の間隔の場合は trapzsimps が使える。ただし、後者の Simpson 法については原理上、点の個数の偶奇性や、被積分関数が高次数の多項式の場合は求積値が正しく求められないことを断っている。

  • Python のモジュール ctypes を利用することで、計算時間を短縮できるかもしれない。上等な話題なので本ノートでは割愛。

  • 一階ベクトル常微分方程式を解くのには関数 odeint を用いる。

    • 任意の階数の常微分方程式は、適宜変形して一階の形式に帰着させることで odeint を用いる。

    • 計算効率を上げるためのオプション(キーワード)引数がたくさんある。例えば微係数を求める関数を引数 Dfun に指示するなど。

Optimization (scipy.optimize)

最適化アルゴリズムや一変数関数の根を求める計算機能等を提供するサブパッケージ。

Interpolation (scipy.interpolate)

補間機能に関する機能を提供するサブパッケージ。ノートは別項 補間 で扱う。

  • 一次元データの補間はクラス interp1d を使う。

  • 関数 griddatan 次元データの補間のインターフェイス。

  • 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 を用いる。

  • 固有値・固有ベクトル、各種分解も可能。

  • 行列のテイラー展開による各種関数もサポート。

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 以降では廃止された。