两个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.,0.0)

print(angle_dot(np.array([2.,-143.2)

解决方法

使用以下公式定义角度(这只是定义角度的一种方法):

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个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))))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...