演算子
NumPyではベクトル,行列の積の計算に
matmul()
dot()
@
が利用できる.
2次元まではmatmul()
とdot()
は同じ演算を行うが,3次元以上では異なるので注意.
@
はa @ b
のように用いる.これはmatmul(a, b)
と同じ.
@
による演算はPython 3.5からサポート.
Import
import numpy as np
ベクトルの内積
a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
np.matmul(a, b) # 0*3 + 1*4 + 2*5
[出力]
14
ベクトルと行列の積
1次元配列(ベクトル)は縦ベクトル,横ベクトルの区別は無いので,引数の位置によって結果が異なる.
ベクトルを左から行列にかける場合
ベクトルを第1引数にする場合,下記の例では1行2列と解釈される.
$$ \begin{pmatrix} 0 & 1 \\ \end{pmatrix} \begin{pmatrix} 0 & 1 \\ 2 & 3 \\ \end{pmatrix} = \begin{pmatrix} 2 & 3 \\ \end{pmatrix} $$
この計算で得られるのは1次元配列なので行とか列の区別はなくなる.
a = np.array([0, 1]) # ベクトル
bmat = np.array([[0, 1], [2, 3]]) # 行列
np.matmul(a, bmat)
[出力]
array([2, 3])
ベクトルを右から行列にかける場合
ベクトルを第2引数にする場合,下記の例では2行1列と解釈される.
$$ \begin{pmatrix} 0 & 1 \\ 2 & 3 \\ \end{pmatrix} \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} = \begin{pmatrix} 1 \\ 3 \\ \end{pmatrix} $$
この計算で得られるのは1次元配列なので行とか列の区別はなくなる.
np.matmul(bmat, a)
[出力]
array([1, 3])
行列の積
$$ \begin{pmatrix} 0 & 1 \\ 2 & 3 \\ \end{pmatrix} \begin{pmatrix} 0 & 1 \\ 2 & 3 \\ \end{pmatrix} = \begin{pmatrix} 2 & 3 \\ 6 & 11 \\ \end{pmatrix} $$
amat = np.array([[0, 1],[2, 3]])
bmat = np.array([[0, 1], [2, 3]])
np.matmul(amat, bmat)
[出力]
array([[ 2, 3],
[ 6, 11]])