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