画像処理や機械学習の現場では、データを「行列」として扱い、それらを足し合わせたり掛け合わせたりする計算が頻繁に行われます。 NumPyを使えば、複雑な多重ループを書くことなく、数式に近いシンプルな記述でこれらの演算を実装できます。
ここでは、2つの行列を用いた「足し算・引き算」と、数学的な「行列の掛け算(行列積)」の正しい実装方法を解説します。
目次
1. 行列の足し算と引き算
行列同士の加算と減算は、「同じ位置にある数字同士を計算する」 というシンプルなルール(要素ごとの演算)です。 Pythonの通常の演算子 + と - をそのまま使うだけで計算できます。
サンプルコード
ここでは、2行2列の行列 X と Y を定義して計算してみます。
import numpy as np
def matrix_basic_calc():
# 行列 X の定義
X = np.array([
[5, 10],
[2, 4]
])
# 行列 Y の定義
Y = np.array([
[3, 1],
[1, 2]
])
print("--- Matrix X ---")
print(X)
print("--- Matrix Y ---")
print(Y)
# 足し算 (X + Y)
# 左上の要素: 5 + 3 = 8
print("\n[足し算: X + Y]")
add_result = X + Y
print(add_result)
# 引き算 (X - Y)
# 左上の要素: 5 - 3 = 2
print("\n[引き算: X - Y]")
sub_result = X - Y
print(sub_result)
if __name__ == "__main__":
matrix_basic_calc()
実行結果
--- Matrix X ---
[[ 5 10]
[ 2 4]]
--- Matrix Y ---
[[3 1]
[1 2]]
[足し算: X + Y]
[[ 8 11]
[ 3 6]]
[引き算: X - Y]
[[2 9]
[1 2]]
2. 行列の掛け算(行列積)
行列の計算で最も間違いやすいのが「掛け算」です。 単に X * Y と書くと、足し算と同様に「要素ごとの掛け算」になってしまいます。
数学的な意味での「行列の積(行と列を掛けて足す計算)」を行うには、np.dot() 関数を使用します。
サンプルコード
import numpy as np
def matrix_dot_product():
# 行列 A
A = np.array([
[1, 2],
[3, 4]
])
# 行列 B
B = np.array([
[5, 6],
[7, 8]
])
# 行列積の計算: np.dot(A, B)
# 計算ロジック(左上の値): (1 * 5) + (2 * 7) = 5 + 14 = 19
dot_result = np.dot(A, B)
print("--- 行列積 (np.dot) ---")
print(dot_result)
# 【補足】Python 3.5以降の新しい書き方
# @ 演算子を使うと、より数式っぽく書けます
dot_result_new = A @ B
print("\n--- 行列積 (@ 演算子) ---")
print(dot_result_new)
if __name__ == "__main__":
matrix_dot_product()
実行結果
--- 行列積 (np.dot) ---
[[19 22]
[43 50]]
--- 行列積 (@ 演算子) ---
[[19 22]
[43 50]]
まとめ
- 足し算・引き算:
+,-でOK(要素ごとに計算される) - 掛け算: 行列計算として扱うなら
np.dot()または@を使う。*は使わない。
特に掛け算の違いはバグの原因になりやすいため、NumPyを使う上で最も重要なポイントの一つです。
