Python入門トップページ


目次

  1. NumPy とは
  2. Python リストの場合
  3. NumPy の使用例
  4. NumPy で線形代数
    1. 行列式
    2. 単位行列
    3. 逆行列
    4. 行列の階数
    5. 固有値
    6. 固有値の応用例:PageRank
    7. ノルム(L1ノルムとL2ノルム)
  5. NumPy の乱数生成

NumPy

NumPy で線形代数

逆行列

正方行列 \(A\) に対して,\(AX = E\) となるような正方行列 \(X\) が存在するとき,正方行列 \(A\) は正則であるといい,\(X\) を \(A\) の逆行列 (inverse matrix)といいます.また,正方行列 \(A\) が正則であるための必要十分条件は \(|A| \neq 0\) です.逆行列は np.linalg.inv() を用いると良いでしょう.なお,\(|A|\) は正方行列 \(A\) の行列式です.

3次元単位行列
import numpy as np # プログラムの先頭でモジュールを読み込む
A = np.array([[2, 0, 1], [-1, 1, 0],[-2, 3, 4]])
print(A)
inv = np.linalg.inv(A)
print(inv)
[[ 2  0  1]
 [-1  1  0]
 [-2  3  4]]
[[ 0.57142857  0.42857143 -0.14285714]
 [ 0.57142857  1.42857143 -0.14285714]
 [-0.14285714 -0.85714286  0.28571429]]

実際に \(AX = E\) となることを確認しておこう.

逆行列の確認
print(np.dot(A, inv))
[[ 1.00000000e+00  0.00000000e+00  0.00000000e+00]
 [ 1.11022302e-16  1.00000000e+00 -5.55111512e-17]
 [ 0.00000000e+00  4.44089210e-16  1.00000000e+00]]

上の結果で 1.00000000e+00 は \(1.0 \times 10^0 = 1.0\) を意味し,1.11022302e-16 は \(1.11022302 \times 10^{-16} = 0.000000000000000111022302 \approx 0.0 \) を意味することに注意しよう.つまり結果は単位行列になっています.なお,Numpy では np.set_printoptions(suppress=True) という命令を実行することで,上のような指数形式の表示ではなく小数形式で表示する指定も可能です.次の通り実行すると単位行列であることがより分かりやすくなります.

小数形式で表示
np.set_printoptions(suppress=True)
print(np.dot(A, inv))
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [-0.  0.  1.]]

さらに,この正方行列 \(A\) の行列式を求めると \(|A| \neq 0\) なることも確認できます.

行列式の確認
det = np.linalg.det(A)
print(det)
6.999999999999998

もちろん逆行列が存在しない行列もあります.次のような行列は行列式が 0 となるので正則ではなく,逆行列の計算でエラーが表示されます.

行列式の確認
A = np.array([[2, 0, 1], [2, 0, 1],[-2, 3, 4]])
print(A)
det = np.linalg.det(A)
print(det)
inv = np.linalg.inv(A)
print(inv)
[[ 2  0  1]
 [ 2  0  1]
 [-2  3  4]]
0.0
------------------------------------------------
LinAlgError    Traceback (most recent call last)
(以下のエラーメッセージは省略)

目次に戻る