つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方10 ~ 行列の定義・操作

 今回はSymPyを用いて行列計算を扱うための行列の定義、生成、操作する方法について紹介する。

1. 行列・ベクトルの定義

 下の行列

 {\bf{A}}= \begin{pmatrix} a&b\\ c&d \end{pmatrix}

定義するには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を用いて行列計算を扱うための行列の定義、生成、操作する方法について紹介した。次回は行列のいろいろな演算方法について紹介する。