今回はSymPyを用いて行列計算を扱うための行列の定義、生成、操作する方法について紹介する。
1. 行列・ベクトルの定義
下の行列
定義するにはMatrix([[a,b],[c,d]])
を用いる。行の要素は[a,b]
で列を,
で区切る。(この辺りはnumpyなどと同じ概念)
from sympy import * a,b,c=symbols('a b c') e,f,d=symbols('e f d') A=Matrix([[a, b], [c, d]]) A >Matrix([ [a, b], [c, d]])
3行2列の行列の場合は
B=Matrix([[a, b], [c, d], [e, f]]) >Matrix([ [a, b], [c, d], [e, f]])
またベクトルはMatrix([x,y])
とすると列ベクトル(x,y)が定義できる。
b1=Matrix([x,y]) b1 >Matrix([ [x], [y]])
なお行ベクトルの場合は2重カギ括弧[[,]]
を用いる。
b2=Matrix([[x,y]]) b2 >Matrix([[x, y]])
正しく行列を定義できていれば以下のように演算が実行できる。
A*b1 > Matrix([ [a*x + b*y], [c*x + d*y]]) b2*b1 >Matrix([[x**2 + y**2]])
2. 行列の操作
行列の数を取得するには.shape
を用いる。
A.shape >(2, 2) b.shape >(2, 1)
行列の特定の行または列の成分を取得するには行は.row()
、列は.col()
を用いる。例えば、
A.row(0) >Matrix([[a, b]]) A.col(1) >Matrix([ [b], [d]])
行列に行または列を追加するには、行の場合は.row_insert(追加する行番号, 追加する行)
を用いる。
M=A.row_insert(0,Matrix([[e,f]]))
M
>Matrix([
[e, f],
[a, b],
[c, d]])
また列の場合は.row_insert(追加する列番号, 追加する列)
を用いる。
N=A.col_insert(1,Matrix([e,f]))
N
>Matrix([
[a, e, a],
[c, f, c]])
行列から行または列を削除する場合は
M.col_del(1) # Mから2行目[a,b]を削除 M >Matrix([ [e, f], [c, d]]) N.row_del(2) # Nから3列目[[a],[c]]を削除 N.col_del(2) N >Matrix([ [a, e], [c, f]])
注意点としては、削除する場合は元の行列が上書きされてしまう点にある。
A.transpose() >Matrix([ [a, c], [b, d]])
行列の転置をとる場合は.transpose()
を用いる。
A.transpose() >Matrix([ [a, c], [b, d]])
さらに随伴行列(転置+複素共役)は.adjoint()
を用いる。
C=Matrix([[1+I,-1-I],[1-I,1+2*I]]) C.adjoint() >Matrix([ [ 1 - I, 1 + I], [-1 + I, 1 - 2*I]])
3. 行列の生成
単位行列、ゼロ行列、1のみの行列、対角行列はそれぞれ専用の生成コマンドがある。
単位行列はeye()
を用いる。()内にサイズを指定するが、正方行列以外も指定できる。
eye(2) >Matrix([ [1, 0], [0, 1]]) eye(3,2) >Matrix([ [1, 0], [0, 1], [0, 0]])
1のみの行列はones()
、ゼロ行列はzeros()
を用いる。
ones(3,2) >Matrix([ [1, 1], [1, 1], [1, 1]]) zeros(2,3) >Matrix([ [0, 0, 0], [0, 0, 0]])
対角行列はdiag(対角項成分)
を用いる。
diag(a,b,c,d) >Matrix([ [a, 0, 0, 0], [0, b, 0, 0], [0, 0, c, 0], [0, 0, 0, d]])
4. まとめ
今回はSymPyを用いて行列計算を扱うための行列の定義、生成、操作する方法について紹介した。次回は行列のいろいろな演算方法について紹介する。