NumPyで行列とベクトルの積を求める方法

Pythonで行列とベクトルの積を求めたいときは、NumPyを使うのが一般的です。ここではそのための方法についてわかりやすく解説していきます。

目次

1. 行列とベクトルの積とは

行列とベクトルの積とは、ベクトルを行列に入力して、新しいベクトルを出力するというものです。これを式で表すと \(A\vec{x}=\vec{y}\) となります。これは、幾何学的には以下のアニメーションで示しているように、入力ベクトルが出力ベクトルへと移動することを表しています。

より詳しくは『行列とベクトルの積とは何か?計算方法と幾何学的な意味を徹底解説』で解説しているので、ぜひご確認ください。

なお、計算方法は以下の通りです。

2次元ベクトルと2次行列の積

\[
\begin{eqnarray}
A\vec{v}
=
\left[ \begin{array}{cc} a_{11} & a_{12} \\a_{21}&a_{22} \end{array} \right]
\left[ \begin{array}{cc} v_1 \\ v_2 \end{array} \right]
=
\left[ \begin{array}{cc}
a_{11}v_1+a_{12}v_2 \\
a_{21}v_1+a_{22}v_2 \end{array} \right]
\end{eqnarray}
\]

3次元ベクトルと3次行列の積

\[
A\vec{v}= \left[ \begin{array}{cc}
a_{11} & a_{12} & a_{13} \\
a_{21}& a_{22} & a_{23}\\
a_{31}& a_{32} & a_{33}
\end{array} \right]
\left[ \begin{array}{cc} v_1 \\ v_2 \\ v_3 \end{array} \right]
=
\left[ \begin{array}{cc}
a_{11}v_1 +a_{12}v_2+ a_{13}v_3 \\
a_{21}v_1+ a_{22}v_2 + a_{23}v_3\\
a_{31}v_1+ a_{32}v_2 + a_{33}v_3
\end{array} \right]
\]

2. NumPyで行列とベクトルの積を計算する方法

NumPyで行列とベクトルの積を計算するには演算子 @ を使います。

2.1. 2次行列と2次元ベクトルの積

例として以下の計算を行ってみましょう。

\[
\begin{eqnarray}
A\vec{v}
=
\left[ \begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array} \right]
\left[ \begin{array}{cc} 2 \\ -1 \end{array} \right]
=
\left[ \begin{array}{cc}
0 \\
2 \end{array} \right]
\end{eqnarray}
\]

これは以下のようにおこないます。なお、NumPy配列でベクトルや行列を作成する方法は、『Numpyでベクトルや行列を作成する方法【線形代数】』で解説していますので、ぜひご確認ください。

In [1]:
import numpy as np
# 行列を作成
A=np.array([[1,2],[3,4]])
print(A)
[[1 2]
 [3 4]]
In [2]:
# ベクトルを作成
v=np.array([2,-1])
print(v)
[ 2 -1]
In [3]:
# 行列とベクトルの積
A@v
Out[3]:
array([0, 2])

2.2 3次行列と3次元ベクトルの積

もう一つ以下の計算を行ってみましょう。

\[
\begin{eqnarray}
A\vec{v}
=
\left[ \begin{array}{cc} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array} \right]
\left[ \begin{array}{cc} 2 \\ 2 \\-2 \end{array} \right]
=
\left[ \begin{array}{cc}
0 \\
2 \\
-2 \end{array} \right]
\end{eqnarray}
\]

次の通りです。

In [1]:
import numpy as np
# 3次正方行列を作成
A=np.array([[1,0,1],[0,1,0],[0,0,1]])
A
Out[1]:
array([[1, 0, 1],
       [0, 1, 0],
       [0, 0, 1]])
In [2]:
# ベクトルを作成
v=np.array([2,2, -2])
print(v)
[ 2  2 -2]
In [3]:
# 行列とベクトルの積
A@v
Out[3]:
array([ 0,  2, -2])

なお行列の行数とベクトルの列数が揃っていれば、非正方行列とベクトルの積も行えます。

2.3. 複数の積を一括取得

次のように書くと、複数の行列とベクトルとの積を一括で取得することができます。

In [1]:
import numpy as np
# 3つの2次正方行列
A=np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,0],[1,2]]])
A
Out[1]:
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]],

       [[9, 0],
        [1, 2]]])
In [2]:
# ベクトル
v=np.array([1,1])
v
Out[2]:
array([1, 1])
In [3]:
A@v
Out[3]:
array([[ 3,  7],
       [11, 15],
       [ 9,  3]])

3. まとめ

以上がNumPyで行列とベクトルの積を計算する方法です。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる