Pythonで行列と単位行列やベクトルの積を計算する

リストを使った行列に対する単位行列

リストを使って行列の計算をする際に、単位行列を使う必要があることがあります。単位行列とは、ある行列に対し、左から掛けても右から掛けても計算結果が元の行列と等しくなるものをいいます。

リストを使った行列の積の計算

はじめに、今後リストを使った行列の積を計算するので、そのための関数を作成します。

リストを使った行列の積を計算
  1. def multi_list(left,right):
  2. l_mult=[]
  3. for row in left:
  4. l_temp=[]
  5. for col in zip(*right):
  6. elm=0
  7. for row_nth,col_nth in zip(row,col):
  8. elm+=row_nth*col_nth
  9. l_temp.append(elm)
  10. l_mult.append(l_temp)
  11. return l_mult

leftとrightに2次元のリストで表現した行列を代入し、関数を呼び出します。

単位行列の定義と計算

3×3の行列m_xと、同じ形式の単位行列l_iを定義します。単位行列は行と列のインデックスが等しい要素は1、それ以外の要素は0の行列になります。前に作った関数を使い、m_xの左右から単位行列との積を計算します。

行列と単位行列の積の計算
  1. m_x =[[1, 2, 3],
  2. [4, 5, 6],
  3. [7, 8, 9]]
  4. l_i = [[1, 0, 0],
  5. [0, 1, 0],
  6. [0, 0, 1]]
  7. print(multi_list(m_x,l_i))
  8. print(multi_list(l_i,m_x))

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

いずれも計算結果は元の行列m_xと等しくなることがわかります。

単位行列の作成

単位行列を定義するとき、単純にリストを定義することもできますが、次元が大きくなると大変なので、簡単に定義するプログラムを作成します。

for文で単位行列を定義する

単位行列を定義する
  1. dim=5
  2. eye=[]
  3. for i in range(dim):
  4. l_temp=[]
  5. for elm in range(dim):
  6. if i == elm:
  7. l_temp.append(1)
  8. else:
  9. l_temp.append(0)
  10. eye.append(l_temp)
  11. eye

[[1, 0, 0, 0, 0],
 [0, 1, 0, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 0, 1, 0],
 [0, 0, 0, 0, 1]]

意外と手間がかかります。

リスト内包表記で単位行列を

リスト内包表記だと1行で記述することができます。

リスト内包表記で単位行列を定義する
  1. dim=5
  2. [[1 if row==col else 0 for col in range(dim)] for row in range(dim)]

計算結果は同じです。

NumPyによる単位行列

NumPyによる行列の定義とidentity関数

行列の定義

NumPyでは次の通り行列を定義します。

NumPyでの行列の定義
  1. import numpy as np
  2. m_a =np.array([[1, 2, 3],
  3. [4, 5, 6],
  4. [7, 8, 9]])

identity関数

NumPyでは、identity関数を使い単位行列を定義することができます。ここでは、3次元の単位行列を作成するので、引数に次元数である3を指定します。

identity関数による単位行列の定義
  1. np.identity(3)

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])	

単位行列の要素の型を定義する

特に指定しないと、各要素は浮動小数点型になるので、整数型にするときにはdtype=intとして整数型にしていします。

identity関数による型の定義
  1. np.identity(3,dtype=int)

array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

単位行列を使った計算

NumPyで定義した行列に対し、単位行列を左から掛けても右から掛けても元の行列になります。

単位行列を使った行列の計算
  1. print(n_a@np.identity(3))
  2. print(np.identity(3)@n_a)

[[1. 2. 3.]
 [4. 5. 6.]
 [7. 8. 9.]]

eye関数による単位行列の定義

NumPyではeye関数でも単位行列を定義することができます。eye関数でも各要素の型を定義することができます。

eye関数による単位行列の定義
  1. np.eye(3,dtype=int)

array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

eye関数では次の通り、5×3のように正方行列でなくても単位行列を定義することができます。

eye関数では、大きさを列数、行数の順に定義することにより、正方行列以外の単位行列も指定することができます。

eye関数による正方行列以外の単位行列の定義
  1. np.eye(5,3,dtype=float)

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.],
       [0., 0., 0.]])

SymPyによる行列の定義と単位行列

SymPyでは次の通り行列を定義します。

SymPyモジュールによる行列の定義

SymPyモジュールによる行列の定義
  1. import sympy
  2. s_x = sympy.Matrix([[1, 2, 3],
  3. [4, 4 ,6],
  4. [7, 8 ,9]])

SymPyモジュールもeye関数を使い単位行列を定義します。

SymPyモジュールによる単位行列

SymPyモジュールもeye関数を使うと単位行列を定義することができます。

SymPyモジュールによる単位行列の定義
  1. sympy.eye(3)

Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])

単位行列を右から掛けても左から掛けても、元の行列になります。

SymPyモジュールにおける単位行列(eye関数)
  1. print(s_x@sympy.eye(3))
  2. print(sympy.eye(3)@s_x)

Matrix([[1, 2, 3], [4, 4, 6], [7, 8, 9]])
Matrix([[1, 2, 3], [4, 4, 6], [7, 8, 9]])

Identity関数を使っても単位行列を定義することができます。

SymPyモジュールにおける単位行列(Identity関数)
  1. print(s_x@sympy.Identity(3))
  2. print(sympy.Identity(3)@s_x)

Matrix([[1, 2, 3], [4, 4, 6], [7, 8, 9]])
Matrix([[1, 2, 3], [4, 4, 6], [7, 8, 9]])

計算結果は同じです。ただし、Identity関数で定義した単位行列はprint関数で表示してもIと表示されるのみです。配列の内容を見るときにはas_explicit()メソッドを使います。

as_explicitメソッドによる表示
  1. x=sympy.Identity(3)
  2. print(x)
  3. print(x.as_explicit())

I
Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])

as_explicitメソッドは、Matrixの内容を明示的に示してくれます。