Python

Python行列の積 Numpy(np.dot)

 

目標

 

Pythonを用いて行列の積の計算を行えるようにします。

スポンサーリンク

行列の積

 

3行3列の行列\(A\)と\(B\)を考えます。

\begin{align*}A=\begin{pmatrix}
1 &2 &3 \\
4 &5 &6 \\
7 & 8 &9
\end{pmatrix}\cdot\cdot\cdot (1)\end{align*}

\begin{align*}B=\begin{pmatrix}
11 &12 &13 \\
14 &15 &16 \\
17 &18 &19
\end{pmatrix}\cdot\cdot\cdot (2)\end{align*}

 

行列の積とは、

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 \\
4 &5 &6 \\
7 & 8 &9
\end{pmatrix}\begin{pmatrix}
11 &12 &13 \\
14 &15 &16 \\
17 &18 &19
\end{pmatrix}\cdot\cdot\cdot (3)\end{align*}

を計算することになります。

計算方法は、「行列\(A\)の\(i\)行目」「行列\(B\)の\(j\)列目」の各成分同士の積を足し合わせたものを\(i\)行\(j\)列目に書いていく。

 

 

具体的には、下記のようなことを繰り返していきます。

計算するのは結構面倒です。


※行列の積はどのような行列同士でも計算できるわけではありません。

例えば「\(i\)行\(j\)列の行列\(A\)」と「\(m\)行\(n\)列の行列\(B\)」があったとします。

行列の積が計算できるのは、\(i=n\)(一つ目の行列Aの”行”と行列Bの”列”の数が同じ)の場合だけです。

だからこのような場合は計算ができません。

\begin{align*}A=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15
\end{pmatrix}\end{align*}

\begin{align*}B=\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
\end{pmatrix}\end{align*}

 

この2つの行列の積

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15
\end{pmatrix}\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
\end{pmatrix}\end{align*}

 

Pythonでもこの場合は計算エラーが出ます。

 

Pythonで行列の計算

 

では、(3)式

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 \\
4 &5 &6 \\
7 & 8 &9
\end{pmatrix}\begin{pmatrix}
11 &12 &13 \\
14 &15 &16 \\
17 &18 &19
\end{pmatrix}\cdot\cdot\cdot (3)\end{align*}

の計算をPythonにしてもらいましょう。

 

Pythonを用いて行列の計算を行うには、「numpyのdot関数」を使います。

実行結果

面倒な結果も楽々計算してくれます。

 

「3行5列の行列」と「5行3列の行列」の積

 

これも計算はできます。

例えば下記のような2つの行列があったとします。

\begin{align*}A=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15
\end{pmatrix}\cdot\cdot\cdot (4)\end{align*}

\begin{align*}B=\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
30 &31 &32 \\
33 &33 &35 \\
\end{pmatrix}\cdot\cdot\cdot (5)\end{align*}

 

この2つの行列の積とは、

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15
\end{pmatrix}\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
30 &31 &32 \\
33 &33 &35 \\
\end{pmatrix}\cdot\cdot\cdot (6)\end{align*}

を計算することになります(手計算はめちゃくちゃめんどうです)

 

これをPythonで実行します。

実行結果

3行3列の行列が結果として出てきました。

 

「3行5列の行列」と「3行3列の行列」の積

 

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15
\end{pmatrix}\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
\end{pmatrix}\end{align*}

を計算してみることにします。

これはエラーが出ます。

結果は下記のようなエラーが出されてしまいました。

 

「5行5列の行列」と「3行3列の行列」の積

 

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15\\
16 &17 &18 &19&20\\
21 &22 &23 &24&25
\end{pmatrix}\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
\end{pmatrix}\end{align*}

を計算してみることにします。

これはエラーが出ます。

結果はエラーが出ます。

 

「5行5列の行列」と「5行2列の行列」の積

 

 

\begin{align*}AB=\begin{pmatrix}
1 &2 &3 &4&5\\
6 &7 &8 &9&10 \\
11 &12 &13 &14&15\\
16 &17 &18 &19&20\\
21 &22 &23 &24&25
\end{pmatrix}\begin{pmatrix}
21 &22 \\
23 &24 \\ 
25 &26 \\
27 &28 \\ 
29 &30 \\
\end{pmatrix}\end{align*}

 

これなら1つ目の行列の”行”2つ目の行列の”列”数が合っているので計算ができます。

 

実行してみると、

 

どうやらnp.matrixとしなくても計算してくれる?

 

行列の積の計算には、計算する行列を

と書かずに、

としてても行列の積は計算してくれるようです。

 

試しにしてみます。

実行結果

 

結果は「np.matrix」で行列を作った場合と同じでしたね。

 

実はmatrixで行列を作成した場合は、A*Bで行列の積を計算できる

 

後で知ったのですが、行列の積はA*Bと書いても良いみたいです。

実行結果

 

【プロフィール】

カマキリ
(^^)

大学の専攻は物性理論で、Fortranを使って数値計算をしていました。
CAEを用いた流体解析は興味がありOpenFOAMを使って勉強しています。

プロフィール記事はこちら

 

大学学部レベルの物理の解説をします 大学初学者で物理にお困りの方にわかりやすく解説します。

このブログでは主に大学以上の物理を勉強して記事にわかりやすくまとめていきます。

  • ・解析力学
  • ・流体力学
  • ・熱力学
  • ・量子統計
  • ・CAE解析(流体解析)
  • note
    noteで内容は主に「プログラミング言語」の勉強の進捗を日々書いています。また、「現在勉強中の内容」「日々思ったこと」も日記代わりに書き記しています。
  • youtube
    youtubeではオープンソースの流体解析、構造解析、1DCAEの操作方法などを動画にしています。
    (音声はありません_(._.)_)
  • Qiita
    Qiitaではプログラミング言語の基本的な内容をまとめています。