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 (積と商が行列としての演算になる)の挙動をごっちゃにして理解、記述したのではないかと思います。。。参考にしていただく方は、ご利用の前にお手元の環境で確認をしてみてください。

追記 2: 上の追記については積( * )だけが対象で、商( / )は対象外でした。。つまり、積は行列の dot 演算になりますが、商が要素同士の演算になる点についてはそのとおりでした。軽く確認して書くといけませんね。参考にされた方は、混乱させてしまいすみません。。(指摘をいただき知りました。ありがとうございます。)

メソッド

各種メソッドが用意されています。最大値や平均値など、使用頻度の高そうなものはそのままの名前で用意されています。

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 には行列以外の数学的機能なども豊富に用意されているので、もっと詳しく知りたい場合は公式ドキュメントをご参照ください。

参考