「ベクトルの内積」は、Pythonで容易に計算することができます。
本記事では、Pythonを使用したベクトルの内積の計算方法について、詳しくご説明します。
ベクトルの内積
ベクトルの内積(inner product)は、要素同士の積の総和で定義されます。
以下にNumPyを使用したベクトルの内積の確認方法をご紹介します。
numpy.dot()
NumPyのnumpy.dot()は、引数に指定した1次元配列(ベクトル)同士の内積を出力することができます。
#input
import numpy as np
v1 = np.array([ 1, 2, 3])
v2 = np.array([10, 10, 10])
ip = np.dot(v1,v2)
print(ip)
#output
60
numpy.array.dot()
NumPyのnumpy.array.dot()を使用しても、配列(ベクトル)同士の内積を出力することができます。
#input
import numpy as np
v1 = np.array([ 1, 2, 3])
v2 = np.array([10, 10, 10])
ip = v1.dot(v2)
print(ip)
#output
60
numpy.vdot()
NumPyのnumpy.vdot()も、指定した引数同士の内積を出力することができます。
引数が実数の場合、numpy.dot()と結果は変わりません。
引数が複素数の場合、複素共役を取った上で内積を計算します。
#input
import numpy as np
v1 = np.array([ 1, 2, 3])
v2 = np.array([10, 10, 10])
v3 = np.array([1+1j, 2+2j])
v4 = np.array([3+3j, 4+4j])
print("np.dot(v1,v2)={}".format(np.dot(v1,v2)))
print("np.vdot(v1,v2)={}".format(np.vdot(v1,v2)))
print("np.dot(v3,v4)={}".format(np.dot(v3,v4)))
print("np.vdot(v3,v4)={}".format(np.vdot(v3,v4)))
#output
np.dot(v1,v2)=60
np.vdot(v1,v2)=60
np.dot(v3,v4)=22j
np.vdot(v3,v4)=(22+0j)
多次元ベクトルの場合、以下の通りフラットにしてから計算します。
#input
import numpy as np
v1 = np.array([[1, 2, 3],[4, 5, 6]])
v2 = np.array([[9, 8, 7],[6, 5, 4]])
v3 = np.array([1, 2, 3, 4, 5, 6])
v4 = np.array([9, 8, 7, 6, 5, 4])
print("np.vdot(v1,v2)={}".format(np.vdot(v1,v2)))
print("np.vdot(v3,v4)={}".format(np.vdot(v3,v4)))
#output
np.vdot(v1,v2)=119
np.vdot(v3,v4)=119
フラットに結合した配列同士の内積と、結果が等しいことがわかると思います。
numpy.inner()
NumPyのnumpy.inner()も、指定した引数同士の内積を出力することができます。
1次元ベクトルの場合、numpy.dot()と結果は変わりません。
引数が多次元ベクトルの場合、軸方向に計算した配列を生成します。
#input
import numpy as np
v1 = np.array([[1, 2, 3],[4, 5, 6]])
v2 = np.array([[9, 8, 7],[6, 5, 4]])
v3 = np.array([1, 2, 3, 4, 5, 6])
v4 = np.array([9, 8, 7, 6, 5, 4])
print("np.inner(v1,v2)=\n{}".format(np.inner(v1,v2)))
print("np.inner(v3,v4)={}".format(np.inner(v3,v4)))
#output
np.inner(v1,v2)=
[[ 46 28]
[118 73]]
np.inner(v3,v4)=119
ベクトルの内角の計算
numpy.dot()を使用して、ベクトルの内角を計算する関数を実装してみます。
#input
import numpy as np
def v_angle(v1, v2):
v1_n = np.linalg.norm(v1)
v2_n = np.linalg.norm(v2)
ip = np.dot(v1, v2)
cos_theta = ip / (v1_n * v2_n)
theta = np.arccos(cos_theta)
deg = np.degrees(theta)
return deg
上記実装した関数にベクトルを引数として指定し、内角を計算してみます。
#input
v1 = np.array([1, 0])
v2 = np.array([np.sqrt(2), np.sqrt(2)])
deg= v_angle(v1, v2)
print("θ = {:.1f}".format(deg))
#output
θ = 45.0
まとめ
この記事では、Pythonを使用したベクトルの内積の計算方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!