Improving calculation performance

モジュールを積極利用する。

配列(行列)演算の事例をもとに

特に、配列の計算など多数回の繰り返し計算にはnumpyの機能を利用すべきである。

以下、に沿って、行列の計算のスピード比較を行ってみる。

次の例は、3つの行列$A$, $B$, $C$の要素を用いて $$ r_{ij} = \sum_{k=1}^{M} a_k b_{ik} c_{kj},\quad {\rm (}\, i = 1,\cdots , N \quad j=1,\cdots ,L \,{\rm )} $$ のように定義された行列$(r{ij})$を4つの方法で行ったものである。

平たく書けば $$ R = (\begin{array}{cccc} a_1 & a_2& \cdots& a_M \end{array} )\odot \left(\begin{array}{cccc} b_{11} & b_{12}& \cdots& b_{1M}\\ b_{21} & b_{22} & \cdots & b_{2M}\\ \vdots & \vdots & \cdots & \vdots\\ b_{N1} & b_{N2} & \cdots & b_{NM} \end{array} \right) \left(\begin{array}{cccc} c_{11} & c_{12}& \cdots& c_{1L}\\ c_{21} & c_{22} & \cdots & c_{2L}\\ \vdots & \vdots & \cdots & \vdots\\ c_{M1} & c_{M2} & \cdots & c_{ML} \end{array} \right) $$

時間のかかり具合を確かめてみてほしい。(演習)

この例は

http://hamukazu.com/2013/12/20/tips-on-numerical-computation-in-python-numpy-scipy/

より引用した。

Exercise 3

4つの計算法N, M, Lを変化させ、計算時間をプロットしてみよう。

$1\times M$の配列aと$N\times M$の配列bの積a*bの結果(返値)を数学的に表現してみよう。また、numpyの配列演算 dot()やouter()などについても調べてノートを作ろう。 (Markdownの練習にもなる)

下記の補足も参照。

補足

numpyでのarrayの積について

numpyの数学関数

numpyの初等関数np.sin()などは、python標準の数学関数と異なり、引数に配列(ndarray型の変数)をとることができる。大きな配列を一気に変換するためには、それを用いること。

cf. 標準関数math.sin()は、引数として単純な数値変数しかとらない。