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 の使い方です。

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる