计算二维矢量之间角度的最快方法

2024-09-29 04:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找有效的替代方法来计算二维向量之间的余弦角。你对这个问题的见解会很有帮助的。在

问题陈述:

vectors是存储向量的二维数组。vectors数组的形状是(N, 2),其中N是向量的数目。vectors[:, 0]有x分量,vectors[:, 1]有y分量。在

我要找出vectors中所有向量之间的夹角。例如,如果vectors中有三个向量A,B,C,我需要找到A and BB and C,和A and C之间的夹角。在

我已经实现了它,想知道其他方法。在

当前实施:

vectors = np.array([[1, 3], [2, 4], [3, 5]])

vec_x = vectors[:, 0]
vec_y = vectors[:, 1]

a1 = np.ones([vec_x.shape[0], vec_x.shape[0]]) * vec_x
a2 = np.ones([vec_x.shape[0], vec_x.shape[0]]) * vec_y
a1b1 = a1 * a1.T
a2b2 = a2 * a2.T
mask = np.triu_indices(a1b1.shape[0], 0) # We are interested in lower triangular matrix
a1b1[mask] = 0
a2b2[mask] = 0
numer = a1b1 + a2b2
denom = np.ones([vec_x.shape[0], vec_x.shape[0]]) * np.sqrt(np.square(a1) + np.square(a2))
denom = denom * denom.T
denom[mask] = 0
eps = 1e-7
dot_res = np.rad2deg(np.arccos(np.divide(numer, denom + eps)))
dot_res[mask] = 0
print(dot_res)

输出:

^{2}$

问题:

  1. 有没有其他方法可以提高效率?

  2. 我们能在某种程度上提高当前版本的速度吗?


Tags: and方法a2a1nponesmask向量
1条回答
网友
1楼 · 发布于 2024-09-29 04:23:18

使用^{}

import numpy as np
import scipy.spatial.distance

vectors = np.array([[1, 3], [2, 4], [3, 5]])
# Compute cosine distance
dist = scipy.spatial.distance.pdist(vectors, 'cosine')
# Compute angles
angle = np.rad2deg(np.arccos(1 - dist))
# Make it into a matrix
angle_matrix = scipy.spatial.distance.squareform(angle)
print(angle_matrix)
# [[ 0.          8.13010235 12.52880771]
#  [ 8.13010235  0.          4.39870535]
#  [12.52880771  4.39870535  0.        ]]

相关问题 更多 >