ベクトルや行列の内積を計算する【Python】

pythonのベクトルの内積のアイキャッチPython

@

@は行列積を計算する演算子ですが、1次元配列であれば内積として利用することができます。
この方法が一番コードとしては見やすいのでオススメです。

import numpy as np

A = np.array([1, 2, 3])
B = np.array([0, 0, 1])
print(A @ B)
# 3

numpy.dot()

numpy.dot()は行列積を計算してくれる関数ですが、1次元配列を渡すと内積を計算してくれます。

import numpy as np

A = np.array([1, 2, 3])
B = np.array([1, 2, 3])
print(np.dot(A, B))
# 14

このように 1×1+2×2+3×3 = 1+4+9 = 14 と内積が計算されていることがわかりますね。

numpy.dot()に行列を渡すと行列積を計算してくれるので、その挙動も確認しておきましょう。

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7,  8]])
print(np.dot(A, B))
# [[19 22]
#  [43 50]]

numpy.inner()

numpy.inner()はその名の通り内積(inner product)を行うための関数です。

import numpy as np

A = np.array([1, 2, 3])
B = np.array([0, 0, 1])
print(np.inner(A, B))
# 3

2次元以上の場合は最後の軸方向に計算されます。
(numpy.dotとは2次元以上で挙動が変わってくるわけですね)

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.inner(A, B))
# [[17 23]
#  [39 53]]

# 1*5+2*6     1*7+2*8
# 3*5+4*6     3*7+4*8

軸(axis)の方向については以下の記事がわかりやすいです

numpyのaxis(軸)を理解する - Qiita
axisとは 多次元の配列を扱うnumpyではaxis(軸)をきちんと理解しておくことが大切です。 例えば、配列の合計値を求めるnumpy.sum()を考えてみましょう。 単純なスカラーや1次元の配列ならば、軸を考えるまでも...

numpy.vdot

numpy.vdot()は二つのベクトルから内積を計算してくれる関数です。

import numpy as np

A = np.array([1, 2, 3])
B = np.array([0, 0, 1])
print(np.vdot(A, B))
# 3

また2次元以上の場合ではフラットにしてから計算されます。

import numpy as np

A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[7, 8, 9], [10, 11, 12]])
print(np.vdot(A, B))
# 217

C = np.arange(1,7)
D = np.arange(7, 13)
print(np.vdot(C, D))
# 217

内積の定義

そもそもの内積の計算方法をおさらいしておくと以下のように表されます

ベクトルの内積は

\(
\vec{a}=
\begin{pmatrix}
a_1 \\
a_2 \\
\vdots\\
a_n\\
\end{pmatrix}
,
\vec{b}=
\begin{pmatrix}
b_1 \\
b_2 \\
\vdots\\
b_n\\
\end{pmatrix}
\\
\vec{a}\cdot\vec{b}=a_1b_1+a_2b_2+\cdots+a_nb_n
\)

行列の内積の定義と性質 - 具体例で学ぶ数学
通常の行列の積について確認してから、行列の内積について解説します。 行列の積 「通常の」行列の積は、図のように

コメント