首页 > 解决方案 > 两个 Numpy 数组之间的点积和度数

问题描述

我想编写一个函数,它接受两个长度相同的 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)

标签: pythonarraysvectorangledot-product

解决方案


使用此公式定义角度(这只是定义它的一种方式):

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)

推荐阅读