2014/11/12

Python Tips:行列演算を扱いたい

Pythonで行列演算をする方法をご紹介します。

Pythonで行列を扱うには「 numpy 」というライブラリを使う方法が一般的です。

基本的な使い方を以下、見ていきます。


行列オブジェクトの生成

行列オブジェクトの生成は matrix 関数で行います。
import numpy as np

# 文字列から生成
m1 = np.matrix('1 2; 3 5')

# リストから生成
m1 = np.matrix([[1, 2], [3, 5]])


要素アクセス

行列の要素へのアクセスには、リストと同じ [] を使います。
m1[0, 1]  # 1行目・2列目の要素

行全体、列全体を取得することも可能です。
m1[0]     # 1行目の要素すべて
m1[0, :]  # 同上

m1[:, 0]  # 1列目の要素すべて

m1[3:5, 0:2]  # 3~4行目・1~2列目の部分行列


四則演算

基本的な四則演算は演算子で行えます。
m1 + m2  # 和
m1 - m2  # 差
m1 * m2  # 積 ただし要素同士(追記: まちがい)
m1 / m2  # 商 ただし要素同士(追記: まちがい)

かけ算と割り算については、いずれも行列の積ではなく、要素同士のかけ算・割り算になることに注意が必要です。

追記: 指摘をいただき numpy 1.13.1 で確認をしたところ、演算 m1 * m2m1 / m2 については、要素同士の演算ではなく行列としての演算が行われるようです。この投稿を書いたときの記憶が確かではないのですが、そのとき私は numpy.array (積と商が要素同士の演算になる)と numpy.matrix (積と商が行列としての演算になる)の挙動をごっちゃにして理解、記述したのではないかと思います。。。参考にしていただく方は、ご利用の前にお手元の環境で確認をしてみてください。


メソッド

各種メソッドが用意されています。最大値や平均値など、使用頻度の高そうなものはそのままの名前で用意されています。
m1.max()  # 最大値
m1.min()  # 最小値
m1.mean() # 平均値
m1.all()  # すべて True なら True それ以外は False
m1.any()  # いずれかひとつでも True なら True それ以外は False


行列の積

* 演算子が要素同士のかけ算に割り当てられているため、行列の積は別のメソッド dot を使います。
m3 = m1.dot(m2) 行列の積


その他線形代数的演算

これらの他にも各種行列演算機能が用意されています。
from numpy import linalg as la

# 転置行列
m1_transposed = la.transpose(m1)

# 逆行列
m1_inv = la.inv(m1)

# 固有値
m1_eigenvalue = la.eig(m1)


以上です。

ほんの一部ですが、 numpy の行列機能を見てみました。 numpy には行列以外の数学的機能なども豊富に用意されているので、もっと詳しく知りたい場合は公式ドキュメントをご参照ください。


参考
numpy.matrix — NumPyマニュアル

2 件のコメント:

wachan さんのコメント...

> m1 * m2 # 積 ただし要素同士
とありますが,
numpy.matrixの場合,演算子*は「要素どうし」ではなく,行列の積を意味するようです.

後藤隼人 さんのコメント...

wachan さん、ご丁寧にご指摘いただきありがとうございます。追記する形で本文を修正させていただきました。