我正在寻找计算二维向量余弦角的高效替代方法。您对这个问题的见解将会很有帮助。
问题陈述:
vectors
是存储向量的二维数组。 vectors
数组的形状为(N, 2)
,其中N
是向量的数量。 vectors [:, 0]
具有x分量,vectors [:, 1]
具有y分量。
我必须查找vectors
中所有向量之间的夹角。例如,如果vectors
中有三个向量A、B和C,则需要找到A和B
、B和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. ]]
问题:
有没有更高效的替代方法?
我们能以某种方式提高当前版本的速度吗?