非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】行列とベクトルの@演算:計算方向で結果が変わるので要注意!

   

Pythonのnumpyでは、@演算子を使うことで行列やベクトルの積を計算できます。しかし、行列積の計算方向によって結果が異なるので要注意です。資格試験などでもここについては出題されるはずなので、この記事で詳細に解説します。

まずはプログラム例

以下のプログラム例の通り行列数の異なる@演算では計算方向で結果が異なります。

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([1, 3])

print(a @ b)
print(b @ a)

# 出力結果
# [ 7 15]
# [10 14]
 

 

[[1, 2], [3, 4]] @ [1, 3] の場合

これは、行列✕ベクトルの計算となり、数式で表すと以下のようになります。

よって、

  • 第1行とベクトルの内積: (1×1)+(2×3)=1+6 = 7
  • 第2行とベクトルの内積: (3×1)+(4×3)=3+12 = 15

これにより、結果は以下の通りとなりプログラムの実行結果は、[ 7 15]と出力されます。

 

[1, 3] @ [[1, 2], [3, 4]] の場合

今度は計算方向を逆にしたパターンです。

今回はベクトルを左から行列に掛けています。この場合ベクトルと行列の積を計算することになります。行列積の計算ルールに従うと、次のようになります。


よって、

  • 第1列に対する計算: (1×1)+(3×3)=1+9 = 10
  • 第2列に対する計算: (1×2)+(3×4)=2+12 = 14

これにより、結果は以下の通りとなりプログラムの実行結果は、[10 14]と出力されます。

 

まとめ

行列積では、計算の方向によって結果が異なるため、行列とベクトルの形状を意識することが重要です。行列 @ ベクトルでは行列の各行とベクトルの内積を計算し、結果は縦ベクトルになります。一方、ベクトル @ 行列ではベクトルと行列の各列との内積を計算し、結果は横ベクトルになります。

この違いを理解することで、numpyを使った計算がスムーズになります。

 

スポンサーリンク

 - Python