【发布时间】:2019-06-12 09:56:09
【问题描述】:
我有超过 500 万对两个 3D 矢量,我需要计算每对之间的角度。 我试过了:
# calculate angle
def unit_vector(vector):
return vector / np.linalg.norm(vector)
def angle_between(v1, v2):
v1_u = unit_vector(v1)
v2_u = unit_vector(v2)
return np.arccos(np.clip(np.dot(v1_u, v2_u), -1.0, 1.0))
例如:
a=[[1,1,1],[1,2,1],[6,4,5]]
b=[[1,0,0],[6,2,2],[1,9,2]]
anglevec=np.zeros(len(a))
for i in range(len(a)):
anglevec[i]=angle_between(a[i], b[i])
print(anglevec)
但是使用循环的实现太慢了。
谁能帮忙?
【问题讨论】:
-
问题是:你真的需要角度吗?通过许多 3d(和 2d)计算,您通常可以跳过角度 (arccos) 并比较点积(或 products)本身。 Arccos 是这里性能最差的,点积是由简单的计算组成的。
-
如果您足够绝望,您可以创建一个 arccos 查找表,例如包含数千个条目。然后可以将参数缩放并截断为整数,即表中的索引。查找速度很快。你的精确度会受到限制,但你可以估计错误,看看你是否能忍受它。
-
当我预先计算单位向量时,我可以在不循环 a 和 b 的情况下进行点积吗?
标签: python performance loops math angle