NumPyで行列演算をマスター!逆行列、行列式、固有値の計算方法
データサイエンス、機械学習、物理学、工学といった分野では、**行列(Matrix)**の演算が計算の基礎となります。NumPyライブラリは、Pythonで効率的に行列演算を行うための強力なツールであり、線形代数の複雑な計算も数行のコードで実現できます。この記事では、NumPyを使って行列の逆行列、行列式、固有値などを計算する方法について、具体的なサンプルコードを交えながら詳しく解説します。
NumPyにおける行列演算の基本
NumPyでは、numpy.arrayで作成した2次元配列が行列として扱われます。線形代数に関する関数は、主にnumpy.linalgモジュールに集約されています。
逆行列の計算:np.linalg.inv()
**逆行列(Inverse Matrix)**は、元の行列に掛け合わせると単位行列になる行列です。逆行列は、連立一次方程式の解を求めたり、線形変換を元に戻したりする際に使われます。正方行列(行と列の数が同じ行列)にのみ存在し、行列式がゼロでない場合にのみ計算可能です。
書式
numpy.linalg.inv(a)
-
a: 逆行列を計算したい正方行列。
サンプルコード
import numpy as np
# 逆行列を計算したい行列
matrix_a = np.array([[2, 5],
[1, 3]])
print("元の行列A:\n", matrix_a)
# 逆行列の計算
inverse_a = np.linalg.inv(matrix_a)
print("\n逆行列A^-1:\n", inverse_a)
# 検証: A * A^-1 が単位行列になることを確認(誤差は許容)
identity_check = np.dot(matrix_a, inverse_a)
print("\nA * A^-1 (単位行列チェック):\n", identity_check)
出力例
元の行列A:
[[2 5]
[1 3]]
逆行列A^-1:
[[ 3. -5.]
[-1. 2.]]
A * A^-1 (単位行列チェック):
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]
行列式の計算:np.linalg.det()
**行列式(Determinant)**は、正方行列から計算される単一のスカラ値です。行列式は、行列が可逆(逆行列が存在する)かどうかを判断したり、線形変換が空間の体積をどれだけ拡大・縮小するかを示したりします。行列式がゼロの場合、その行列は特異(Singular)であり、逆行列は存在しません。
書式
numpy.linalg.det(a)
-
a: 行列式を計算したい正方行列。
サンプルコード
import numpy as np
# 行列式を計算したい行列
matrix_b = np.array([[4, 6],
[3, 8]])
print("元の行列B:\n", matrix_b)
# 行列式の計算
determinant_b = np.linalg.det(matrix_b)
print("\n行列式det(B):", determinant_b)
出力例
元の行列B:
[[4 6]
[3 8]]
行列式det(B): 14.000000000000002
固有値と固有ベクトルの計算:np.linalg.eig()
**固有値(Eigenvalue)と固有ベクトル(Eigenvector)**は、線形変換において、方向が変わらずスケールだけが変わる特別なベクトルとそのスケール因子です。これらは、主成分分析(PCA)や振動解析、量子力学など、多岐にわたる分野でデータの特性やシステムの振る舞いを理解するために不可欠です。
書式
numpy.linalg.eig(a)
-
a: 固有値と固有ベクトルを計算したい正方行列。
戻り値
np.linalg.eig()は、以下の2つの要素を持つタプルを返します。
-
固有値の配列:
w(eigenvalues) -
固有ベクトルからなる行列:
v(eigenvectors)。各列が対応する固有値の固有ベクトルです。
サンプルコード
import numpy as np
# 固有値・固有ベクトルを計算したい行列
matrix_c = np.array([[0, 1],
[-2, -3]])
print("元の行列C:\n", matrix_c)
# 固有値と固有ベクトルを計算
eigenvalues, eigenvectors = np.linalg.eig(matrix_c)
print("\n固有値:\n", eigenvalues)
print("\n固有ベクトル(各列が固有ベクトル):\n", eigenvectors)
# 検証: A * v = lambda * v (Av = λv) が成り立つか確認
# 例: 最初の固有値と固有ベクトルについて
lambda1 = eigenvalues[0]
v1 = eigenvectors[:, 0]
check1 = np.dot(matrix_c, v1)
check2 = lambda1 * v1
print("\n検証 (Av = λv):\n", check1, "\n", check2)
出力例
元の行列C:
[[ 0 1]
[-2 -3]]
固有値:
[-1. -2.]
固有ベクトル(各列が固有ベクトル):
[[ 0.70710678 -0.4472136 ]
[-0.70710678 0.89442719]]
検証 (Av = λv):
[-0.70710678 0.70710678]
[-0.70710678 0.70710678]
その他の重要な線形代数関数
numpy.linalgモジュールには、他にも多くの便利な関数があります。
-
np.linalg.solve(a, b): 連立一次方程式 の解 を計算します。 -
np.linalg.matrix_rank(a): 行列のランク(階数)を計算します。 -
np.linalg.norm(a): 行列やベクトルのノルム(大きさ)を計算します。
サンプルコード (np.linalg.solve)
import numpy as np
# 連立方程式:
# 2x + 3y = 8
# 1x + 2y = 5
A = np.array([[2, 3],
[1, 2]])
B = np.array([8, 5])
# 方程式 Ax = B の解 x を計算
x = np.linalg.solve(A, B)
print("連立方程式の解 x, y:", x)
出力例
連立方程式の解 x, y: [1. 2.]
まとめ
NumPyのnumpy.linalgモジュールは、Pythonで効率的に高度な線形代数計算を行うための強力な機能を提供します。
-
np.linalg.inv(): 行列の逆行列を計算します。 -
np.linalg.det(): 行列の行列式を計算します。 -
np.linalg.eig(): 行列の固有値と固有ベクトルを計算します。 -
np.linalg.solve(): 連立一次方程式を解きます。
これらの関数を使いこなすことで、機械学習モデルの実装、データ次元削減(PCAなど)、物理シミュレーション、最適化問題など、多岐にわたる科学技術計算やデータ分析のタスクを効率的に進めることができます。行列演算は、データサイエンスの強力な基盤です。ぜひ、あなたのNumPyワークフローに取り入れてみてください!🛠️

