numpy で行列の積を求めるときは、numpy.matmul
を使います。ここではこの関数の使い方についてわかりやすく解説していきます。また復習として、行列の積とは何かということにも触れたいと思います。それでは始めましょう。
1. 行列の積とは
行列の積は、以下のアニメーションで示しているように線形代数における写像の合成(=関数を続けて行う処理)のことです。
詳しくは「行列の積(掛け算)とは?その幾何学的意味と計算方法」で解説しているので、ぜひご確認ください。
計算方法は以下の通りです。
\(2×2\) 行列の積
\[
\left[ \begin{array}{cc} a & b \\ c & d \end{array} \right]
\left[ \begin{array}{cc} e & f \\g & h \end{array} \right]
=
\left[ \begin{array}{cc} ae+bg & af+bh \\ ce+dg & cf+dh \end{array} \right]
\]
\(3×3\) 行列の積
\[\begin{eqnarray}
\left[ \begin{array}{ccc}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
a_{31} & a_{32} & a_{33}
\end{array} \right]
\left[ \begin{array}{ccc}
b_{11} & b_{12} &b_{13} \\
b_{21} & b_{22} & b_{23} \\
b_{31} & b_{32} & b_{33}
\end{array} \right]
=
\left[ \begin{array}{ccc}
a_{11}b_{11} + a_{12}b_{21} +a_{13}b_{31} &
a_{11}b_{12} + a_{12}b_{22} +a_{13}b_{32} &
a_{11}b_{13} + a_{12}b_{23} +a_{13}b_{33} \\
a_{21}b_{11} + a_{22}b_{21} +a_{23}b_{31} &
a_{21}b_{12} + a_{22}b_{22} +a_{23}b_{32} &
a_{21}b_{13} + a_{22}b_{23} +a_{23}b_{33} \\
a_{31}b_{11} + a_{32}b_{21} +a_{33}b_{31} &
a_{31}b_{12} + a_{32}b_{22} +a_{33}b_{32} &
a_{31}b_{13} + a_{32}b_{23} +a_{33}b_{33}
\end{array} \right]
\end{eqnarray}\]
Pythonでは、この行列の積は numpy.matmul
で求めることができます。
2. numpy.matmul の使い方
numpy.matmul
の書き方は以下の通りです。
書き方
np.matmul(x1, x2)
パラメーター
引数 | 型 | 解説 |
---|---|---|
x1 | array_like | 配列を渡します。スカラーは不可です。 |
x2 | array_like | 配列を渡します。スカラーは不可です。 |
** このほか基本的なキーワード引数が使用可能です。 |
公式ドキュメント:numpy.matmul
それでは早速サンプルコードを見て確認していきましょう。
2.1. 正方行列同士の積
まずは正方行列同士の積を見ていきましょう。
次の2次正方行列 \(A\) と \(B\) の積 \(AB\) を求めてみましょう。
\[
A=\left[ \begin{array}{cc} 0 & 3 \\ -2 & 1 \end{array} \right],
\hspace{4mm}
B=\left[ \begin{array}{cc} 1 & 1 \\ 0 & 1 \end{array} \right]
\]
次のように書きます。
import numpy as np
A=np.array([[0,3],[-2,1]])
B=np.array([[1,1],[0,1]])
# 行列の積 AB
np.matmul(A,B)
行列の積は掛ける順番によって結果が異なります。\(BA\) が欲しい場合は、引数に入れる行列の順番を変えます。
#行列の積 BA
np.matmul(B,A)
続いて以下の3次正方行列 \(A\) と \(B\) の積 \(AB\) と \(BA\) を求めてみましょう。
\[
A=\left[ \begin{array}{cc} 0 & 3 & 1 \\ -2 & 1 & -1 \\ 2 & -1 & 0 \end{array} \right],
\hspace{4mm}
B=\left[ \begin{array}{cc} 1 & 1 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array} \right]
\]
次のように書きます。
A=np.array([[0,3, 1],[-2,1, -1],[2, -1, 0]])
B=np.array([[1,1,0],[0,1,0],[0,0,1]])
# 行列の積 AB
np.matmul(A,B)
#行列の積 BA
np.matmul(B,A)
2.2. 非正方行列の積
続いて、非正方行列の積を見ていきましょう。なお、この場合は行列 \(A\) の列数と、行列 \(B\) の行数が揃っている必要があります。
まずは以下の \(2\times2\) 行列と \(2\times1\) 行列を計算してみましょう。
\[
A=\left[ \begin{array}{cc} 0 & -1 \\ 1 & 0 \end{array} \right],
\hspace{4mm}
B=\left[ \begin{array}{cc} 3 \\ -1 \end{array} \right]
\]
以下の通りです。
import numpy as np
A=np.array([[0,-1],[1,0]])
B=np.array([[3],[1]])
# 行列の積 AB
np.matmul(A,B)
ちなみにこれは「行列とベクトルの積」と考えることもできます。
なお、\(BA\) の計算では、\(B\) の列数と \(A\) の行数が合わないのでエラーになります。
#行列の積 BA
np.matmul(B,A)
もう一つ、以下の \(2\times3\) 行列と \(3\times4\) 行列を計算してみましょう。
\[
A=\left[ \begin{array}{cc} 2 & -1 & 0 \\ -1 & 3 & 1 \end{array} \right],
\hspace{4mm}
B=\left[ \begin{array}{cc} 3 & 2 & 0 & 0 \\ -1 & 2 & 1 & 2 \\ 0 & 1 & 3 & 4 \end{array} \right]
\]
次のように書きます。
import numpy as np
A=np.array([[2,-1, 0],[-1,3,1]])
B=np.array([[3,2,0,0],[-1,2,1,2],[0,1,3,4]])
# 行列の積 AB
np.matmul(A,B)
線形代数においては、このような非正方行列の積は、「行列の計算まとめ」で解説している通り、次元変換を意味します。
なお、やはり行数と列数が揃わなくなるため、\(BA\) の計算はできません。
#行列の積 BA
np.matmul(B,A)
3. まとめ
以上が numpy で行列の積を求める numpy.matmul
の使い方です。
コメント