配列 ベクトル 行列 統計

NumPyで二つのベクトルのなす角を求める(内積と絶対値の利用)

最終更新日 2023.02.18

ベクトルのなす角は内積の公式を使って求めます。ベクトルの内積は、それぞれのノルムとなす角のコサインの積です。

ベクトルのなす角のコサインはベクトルの内積をそれぞれのノルムの積で割ったものです。

import numpy as np
from numpy import linalg as LA

u = np.array([3, 4])
v = np.array([-4, 3])

i = np.inner(u, v)
n = LA.norm(u) * LA.norm(v)

c = i / n
a = np.rad2deg(np.arccos(np.clip(c, -1.0, 1.0)))

print(a)  # 90.0

NumPy でベクトルのなす角を求める手順をまとめましょう。

  1. ベクトルの内積を求める(i)
  2. それぞれのノルムを求めて、その積を計算する(n)
  3. 内積をノルムの積で割る
  4. なす角のコサインが出る
  5. arccos 関数でコサインから角度(ラジアン)を求める
  6. ラジアンを ° に変換する(rad2deg)

ベクトルのノルム(長さ、絶対値ともいう)は numpy の linalg にある norm という関数で求めます。

ベクトルのなす角を求める独自関数

ベクトルのなす角を求める関数は下のようになります。

import numpy as np
from numpy import linalg as LA


def tangent_angle(u: np.ndarray, v: np.ndarray):
    i = np.inner(u, v)
    n = LA.norm(u) * LA.norm(v)
    c = i / n
    return np.rad2deg(np.arccos(np.clip(c, -1.0, 1.0)))


a = np.array([3, 4])
b = np.array([-4, 3])

print(tangent_angle(a, b))
# 90.0

公式のコード

\vec{u}\cdot\vec{v}=|u||v|\cos{\theta}

\cos{\theta}=\dfrac{|u||v|}{\vec{u}\cdot\vec{v}}