Pythonで行列計算をマスター!NumPyによる行列演算の完全ガイド

 

行列は線形代数の核心的な概念であり、機械学習や数値計算において不可欠です。PythonのNumPyライブラリを使えば、複雑な行列計算も簡単に実行できます。この記事では、行列の基本操作から高度な応用まで、実例を交えて詳しく解説します。

行列の作成と基本操作

行列の作成方法

import numpy as np

# 2次元配列(行列)の作成
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("行列A:")
print(A)
print("行列B:")
print(B)

特殊な行列の作成

# 零行列
zeros = np.zeros((3, 3))
print("零行列:")
print(zeros)

# 単位行列
identity = np.eye(3)
print("単位行列:")
print(identity)

# ランダム行列
random_matrix = np.random.rand(2, 3)
print("ランダム行列:")
print(random_matrix)

基本的な行列演算

行列の加算と減算

# 行列の加算
addition = A + B
print("A + B:")
print(addition)

# 行列の減算
subtraction = A - B
print("A - B:")
print(subtraction)

行列の掛け算

# 要素ごとの掛け算(アダマール積)
element_wise = A * B
print("要素ごとの掛け算:")
print(element_wise)

# 行列の掛け算(行列積)
matrix_mult = np.dot(A, B)
print("行列積 A @ B:")
print(matrix_mult)

# @ 演算子を使用(Python 3.5以降)
matrix_mult2 = A @ B
print("行列積 A @ B(@演算子):")
print(matrix_mult2)

行列の転置と形状変更

転置行列

# 転置行列
A_transpose = A.T
print("Aの転置:")
print(A_transpose)

# transposeメソッドを使用
A_transpose2 = np.transpose(A)
print("Aの転置(別の書き方):")
print(A_transpose2)

行列の形状変更

# 1次元配列を行列に変換
vector = np.array([1, 2, 3, 4, 5, 6])
matrix = vector.reshape(2, 3)
print("リシェイプした行列:")
print(matrix)

# 行列を1次元配列に変換
flattened = matrix.flatten()
print("平坦化した配列:")
print(flattened)

逆行列と行列式

行列式の計算

# 行列式
det_A = np.linalg.det(A)
print(f"行列Aの行列式: {det_A}")

逆行列の計算

# 逆行列
try:
    A_inv = np.linalg.inv(A)
    print("Aの逆行列:")
    print(A_inv)
    
    # 検証: A × A^(-1) = I
    verification = A @ A_inv
    print("検証 A × A^(-1):")
    print(verification)
except np.linalg.LinAlgError:
    print("行列は正則ではありません(逆行列が存在しません)")

固有値と固有ベクトル

# 対称行列の例
symmetric_matrix = np.array([[4, 2], [2, 3]])

# 固有値と固有ベクトルの計算
eigenvalues, eigenvectors = np.linalg.eig(symmetric_matrix)
print("固有値:")
print(eigenvalues)
print("固有ベクトル:")
print(eigenvectors)

行列の分解

LU分解

from scipy.linalg import lu

# LU分解
P, L, U = lu(A.astype(float))
print("P行列(置換行列):")
print(P)
print("L行列(下三角行列):")
print(L)
print("U行列(上三角行列):")
print(U)

特異値分解(SVD)

# 特異値分解
U, s, Vt = np.linalg.svd(A.astype(float))
print("U行列:")
print(U)
print("特異値:")
print(s)
print("V転置行列:")
print(Vt)

連立一次方程式の解法

# Ax = b の形の連立方程式
# 例: 2x + 3y = 7, x + 2y = 4
A = np.array([[2, 3], [1, 2]])
b = np.array([7, 4])

# 解を求める
x = np.linalg.solve(A, b)
print(f"解: x = {x[0]}, y = {x[1]}")

# 検証
verification = A @ x
print(f"検証 Ax = {verification}, b = {b}")

実用的な応用例

画像変換(回転行列)

# 2D回転行列
def rotation_matrix(angle_degrees):
    angle = np.radians(angle_degrees)
    return np.array([[np.cos(angle), -np.sin(angle)],
                     [np.sin(angle), np.cos(angle)]])

# 45度回転
rot_45 = rotation_matrix(45)
print("45度回転行列:")
print(rot_45)

# 点(1, 0)を45度回転
point = np.array([1, 0])
rotated_point = rot_45 @ point
print(f"回転後の点: {rotated_point}")

最小二乗法

# データポイント
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([2.1, 3.9, 6.1, 7.8, 10.2])

# 線形回帰 y = ax + b
A = np.vstack([x_data, np.ones(len(x_data))]).T
coefficients = np.linalg.lstsq(A, y_data, rcond=None)[0]
a, b = coefficients
print(f"線形回帰の係数: y = {a:.2f}x + {b:.2f}")

行列の条件数と数値安定性

# 条件数の計算
cond_A = np.linalg.cond(A)
print(f"行列Aの条件数: {cond_A:.2f}")

if cond_A > 1e12:
    print("行列は数値的に不安定です")
else:
    print("行列は数値的に安定です")

まとめ

Pythonを使った行列計算は、NumPyライブラリにより非常に効率的に実行できます。基本的な四則演算から固有値分解、特異値分解まで、様々な行列演算が簡潔なコードで実現できます。これらの技術は、機械学習、画像処理、科学計算など幅広い分野で活用されています。

行列演算をマスターすることで、より高度な数値計算やデータ分析のアルゴリズムを理解し、実装できるようになります。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座