numpy.matmulで行列の積を求める方法

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 の書き方は以下の通りです。

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]
\]

次のように書きます。

In [1]:
import numpy as np
A=np.array([[0,3],[-2,1]])
B=np.array([[1,1],[0,1]])
# 行列の積 AB
np.matmul(A,B)
Out[1]:
array([[ 0,  3],
       [-2, -1]])

行列の積は掛ける順番によって結果が異なります。\(BA\) が欲しい場合は、引数に入れる行列の順番を変えます。

In [2]:
#行列の積 BA
np.matmul(B,A)
Out[2]:
array([[-2,  4],
       [-2,  1]])

続いて以下の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]
\]

次のように書きます。

In [3]:
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)
Out[3]:
array([[ 0,  3,  1],
       [-2, -1, -1],
       [ 2,  1,  0]])
In [4]:
#行列の積 BA
np.matmul(B,A)
Out[4]:
array([[-2,  4,  0],
       [-2,  1, -1],
       [ 2, -1,  0]])

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]
\]

以下の通りです。

In [1]:
import numpy as np
A=np.array([[0,-1],[1,0]])
B=np.array([[3],[1]])
# 行列の積 AB
np.matmul(A,B)
Out[1]:
array([[-1],
       [ 3]])

ちなみにこれは「行列とベクトルの積」と考えることもできます。

なお、\(BA\) の計算では、\(B\) の列数と \(A\) の行数が合わないのでエラーになります。

In [2]:
#行列の積 BA
np.matmul(B,A)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-41161eaf4c74> in <module>
      1 #行列の積 BA
----> 2 np.matmul(B,A)

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)

もう一つ、以下の \(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]
\]

次のように書きます。

In [3]:
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)
Out[3]:
array([[ 7,  2, -1, -2],
       [-6,  5,  6, 10]])

線形代数においては、このような非正方行列の積は、「行列の計算まとめ」で解説している通り、次元変換を意味します。

なお、やはり行数と列数が揃わなくなるため、\(BA\) の計算はできません。

In [4]:
#行列の積 BA
np.matmul(B,A)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-41161eaf4c74> in <module>
      1 #行列の積 BA
----> 2 np.matmul(B,A)

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 4)

3. まとめ

以上が numpy で行列の積を求める numpy.matmul の使い方です。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる