Python

【Python初心者】Numpyを使って行列計算の使い方をまとめる。

こんにちは(@t_kun_kamakiri)(‘◇’)ゞ

本記事ではPythonのNumpyの使い方のまとめを書いています。

数値計算において行列を使った計算はよく行いますよね?
この記事では、Pythonを使った行列計算の基礎についての解説を行います。

こんな人が対象

  • Python初心者でNumpyを使い始めている
  • Numpyを使った行列計算の基礎を知りたい
スポンサーリンク

ベクトルの表記

ベクトルを列ベクトルで表記すると、

\begin{align*}\boldsymbol{a}=\begin{pmatrix}
a_{x}\\ a_{y}
\\a_{z}
\end{pmatrix}\tag{1}\end{align*}

となります。

行ベクトルで書く場合は、(1)の転置行列として表記します。

\begin{align*}\boldsymbol{{}^t\!a}=\begin{pmatrix}
a_{x}& a_{y} & a_{z}
\end{pmatrix}\tag{2}\end{align*}

ベクトルの内積

ベクトルの内積は、2つのベクトルの各成分についての積を足し合わせたものです。

今、2つのベクトルを\(\boldsymbol{a}\)と\(\boldsymbol{b}\)とします。

ベクトルの内積の表記

\begin{align*}
\boldsymbol{{}^t\!a}\boldsymbol{b}
=\begin{pmatrix}a_{x}& a_{y} & a_{z}\end{pmatrix}\begin{pmatrix}
b_{x}\\ b_{y}\\b_{z}
\end{pmatrix}=a_{x}b_{x}+a_{y}b_{y}+a_{z}b_{z}\tag{3}\end{align*}

 


高校生まではこうしていたかなと思います。

\begin{align*}
\boldsymbol{a}\cdot \boldsymbol{b}=(a_{x} \,a_{y}  \,a_{z})\cdot(b_{x} \,b_{y} \,b_{z})=a_{x}b_{x}+a_{y}b_{y}+a_{z}b_{z}\tag{4}\end{align*}

このように考えても良いでしょう。


ベクトルの内積を計算

例えば次の2つのベクトルの内積を計算してみましょう。

\begin{align*}\boldsymbol{a}=\begin{pmatrix}
4\\ 5
\\6
\end{pmatrix}\tag{5}\end{align*}

\begin{align*}\boldsymbol{b}=\begin{pmatrix}
5\\ 3
\\7
\end{pmatrix}\tag{6}\end{align*}

ベクトルの内積は、

\begin{align*}
\boldsymbol{{}^t\!a}\boldsymbol{b}
=\begin{pmatrix}4& 5 & 6 \end{pmatrix}\begin{pmatrix}
5 \\ 3 \\ 7
\end{pmatrix}=4*5+5*3+6*7=77\tag{7}\end{align*}

Pythonでベクトルの内積「np.inner」を計算

Pythonでベクトルのベクトルの内積は「numpyのinner関数」という関数を使います。

先ほどと同様に、実行すると下記のようになります。

手計算で出した答えと同じですね。

※ちなみに外積は「numpyのcross関数」を使います。
内積が「inner」で、外積が「cross」と覚えておきましょう。

ベクトルの内積のPythonの別表記

ベクトルの内積は「numpyのdot関数」を使っても計算できます。

これを実行すると次の答えを返してくれます。

「nu.dot関数」を使った場合と同じ結果になりましたね。

行列の表記

簡単のために「2行2列の行列」を考えます。

\(A\)という行列は、下記のように表記します。

\begin{align*}A=\begin{pmatrix}
a_{11} & a_{12}\\
a_{21} & a_{22}
\end{pmatrix}
\end{align*}

Pythonで行列の作成

Pythonでの行列の作成はnumpyのmatrixというメソッドを用います。

2行2列の場合

\begin{align*}A=\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
\end{align*}

実行すると以下を返してくれます。

4行4列の場合

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

実行すると以下を返してくれます。

 


13行目は下記のように書いても良いです。

こちらの方が行列の書き方に近くてわかりやすいかもしれませんね。

ただリストを並べただけですってことを理解していればこれでも良いかもしれません。

転置行列とは

簡単のために「2行2列の行列」を考えます。

\(A\)という行列は、下記のように表記します。

$$A=\begin{pmatrix}
a_{11} & a_{12}\\
a_{21} & a_{22}
\end{pmatrix}\tag{8}$$

\(A\)行列の転置行列は以下のように書きます。

$${}^t\!A=\begin{pmatrix}
a_{11} & a_{21}\\
a_{12} & a_{22}
\end{pmatrix}\tag{9}$$

(8)と比較して行と列が入れ替わっただけです。

Pythonを用いて転置行列を作成

例えば、下記の行列Aの転置行列をPythonで作成してみましょう。

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

np.transposeを使って転置行列を作成

転置行列の作成はとても簡単です。

「numpyの中のtranspose関数」を使って転置行列を作成することができます。

実行結果

 

Tプロパティを使って転置行列を作成

もうひとつの方法としては、np.matrixで作成したmatrix値のTプロパティというのを使って転置行列を作成できます。

実行するとこのように返してくれます。

 

見事に行と列が入れ替わってくれましたね。

出力結果が、

$${}^t\!A=\begin{pmatrix}
1 & 5 & 9 & 13\\
2 & 6 & 10 & 14\\
3 & 7 & 11 & 15\\
4 & 8 & 12 & 16
\end{pmatrix\tag{11}$$

となっていることを確認してください。

行列の積

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

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

\begin{align*}B=\begin{pmatrix}
11 &12 &13 \\
14 &15 &16 \\
17 &18 &19
\end{pmatrix}\tag{13}\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}\tag{14}\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で行列の計算

では、

\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}\tag{15}\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}\tag{16}\end{align*}

\begin{align*}B=\begin{pmatrix}
21 &22 &23 \\
24 &25 &26 \\ 
27 &28 &29 \\
30 &31 &32 \\
33 &33 &35 \\
\end{pmatrix}\tag{17}\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}\tag{18}\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と書いても良いみたいです。

実行結果

Pythonで配列に値を追加

グラフを配列の追加というのをPythonを用いて行います。

配列に値を追加するには「numpyのappend」を使います。

実行結果

 

 

【プロフィール】

カマキリ
(^^)

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

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

 

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

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

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