python - 计算二维向量之间角度的最快方法

标签 python numpy vector numpy-ndarray

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

问题陈述:

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

我必须找到 vectors 中所有矢量之间的角度。例如,如果vectors中有三个向量A、B、C,我需要求出A和BB和C之间的夹角>,以及 A 和 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)

输出:

[[ 0.          0.          0.        ]
 [ 8.13010519  0.          0.        ]
 [12.52880911  4.39870821  0.        ]]

问题:

  1. 有没有其他方法可以更有效地做到这一点?

  2. 我们能否以某种方式提高当前版本的速度?

最佳答案

使用scipy.spatial.distance.pdist :

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.        ]]

关于python - 计算二维向量之间角度的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629700/

相关文章:

python - 减少大型分类变量的级别数

python - numpy 中的二进制编码的十进制 dtype

python - numpy 通过 ctypes 调用 sse2

python - 在 SymPy 中使用 Lambdify 消除公共(public)子表达式的最佳实践

vector - Mathematica 如何绘制具有 1 个变量的矢量场?

python - 找不到模块

python - Python 中的正则表达式 (30 M)

python - 查找 xy 数据点图与 numpy 的所有交集?

c++ - 将指针返回二维数组[C++]

c++ - 将模板类型参数的映射存储到 C++ 中的 Vector : Visual Studio