Точечное произведение и угол в градусах между двумя массивами Numpy

#python #arrays #vector #angle #dot-product

#python #массивы #вектор #угол #точечное произведение

Вопрос:

Я хотел бы написать функцию, которая принимает два массива numpy одинаковой длины и возвращает:

  • скалярное произведение двух массивов
  • угол между двумя векторами в градусах

Ожидаемый результат как таковой:

 print(angle_dot(np.array([0., 1.]), np.array([1., 0.])))
## (0.0, 90.0)

print(angle_dot(np.array([2., -1, 1, -2]), np.array([-1., 1.5, 3., 1])))
## (-2.5, 102.5)
  

Это то, что у меня есть до сих пор, кажется, я не могу правильно определить значение угла между массивами.

 import numpy as np
def angle_dot(a, b):
    dot_product = round(np.dot(a, b), 1)
    angle = round(np.degrees(dot_product), 1)
    return dot_product, angle

print(angle_dot(np.array([0., 1.]), np.array([1., 0.])))
## (0.0, 0.0)

print(angle_dot(np.array([2., -1, 1, -2]), np.array([-1., 1.5, 3., 1])))
## (-2.5, -143.2)
  

Ответ №1:

Угол определяется с помощью этой формулы (это всего лишь один из способов его определения):

 cos(alpha) = (a . b) / (|a| * |b|)
  

Итак, угол равен:

 alpha = arccos((a . b) / (|a| * |b|))
  

Код:

 import numpy as np

def angle_dot(a, b):
    dot_product = np.dot(a, b)
    prod_of_norms = np.linalg.norm(a) * np.linalg.norm(b)
    angle = round(np.degrees(np.arccos(dot_product / prod_of_norms)), 1)
    return round(dot_product, 1), angle

print(angle_dot(np.array([0., 1.]), np.array([1., 0.])))

print(angle_dot(np.array([2., -1, 1, -2]), np.array([-1., 1.5, 3., 1])))
  

Вывод:

 (0.0, 90.0)
(-2.5, 102.5)
  

Ответ №2:

Формула для нахождения угла между 2 n-мерными массивами с использованием скалярного произведения равна:

 dot(a, b) = ||a|| * ||b|| * cos(theta)
theta = arccos( dot(a, b) / (||a|| * ||b||))
  

Или в numpy:

 def angle(a, b):
    return np.degrees(np.arccos(np.dot(a, b)/ (np.linalg.norm(a) * np.linalg.norm(b))))