Я должен определить угол (углы) между двумя n-мерными векторами в Python. Например, вход может быть двумя списками как следующее: [1,2,3,4]
и [6,7,8,9]
.
import math
def dotproduct(v1, v2):
return sum((a*b) for a, b in zip(v1, v2))
def length(v):
return math.sqrt(dotproduct(v, v))
def angle(v1, v2):
return math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))
Примечание : это не удастся, если векторы имеют одинаковое или противоположное направление. Правильная реализация находится здесь: https://stackoverflow.com/a/13849249/71522
Используя numpy (настоятельно рекомендуется), вы бы сделали:
from numpy import (array, dot, arccos, clip)
from numpy.linalg import norm
u = array([1.,2,3,4])
v = ...
c = dot(u,v)/norm(u)/norm(v) # -> cosine of the angle
angle = arccos(clip(c, -1, 1)) # if you really want the angle