向量化计算numpy中一组点的所有单位向量
Posted
技术标签:
【中文标题】向量化计算numpy中一组点的所有单位向量【英文标题】:Vectorize calculating all unit vectors for a set of points in numpy 【发布时间】:2020-10-26 03:26:38 【问题描述】:我需要计算两组点之间的所有单位向量。
目前我有这个:
def all_unit_vectors(points_a, points_b):
results = np.zeros((len(points_a) * len(points_b), 3), dtype=np.float32)
count = 0
for pt_a in points_a:
for pt_b in points_b:
results[count] = (pt_a - pt_b)/np.linalg.norm([pt_a - pt_b])
count += 1
return results
in_a = np.array([[51.34, 63.68, 7.98],
[53.16, 63.23, 7.19],
[77.50, 62.55, 4.23],
[79.54, 62.73, 3.61]])
in_b = np.array([[105.58, 61.09, 5.50],
[107.37, 60.66, 6.50],
[130.73, 58.30, 12.33],
[132.32, 58.48, 13.38]])
results = all_unit_vectors(in_a, in_b)
print(results)
哪个(正确)输出:
[[-0.368511 0.01759667 0.01684932]
[-0.3777128 0.02035861 0.00997707]
[-0.47964868 0.03250422 -0.02628129]
[-0.4851439 0.03115273 -0.03235091]
[-0.3551545 0.01449887 0.01145004]
[-0.3644423 0.01727756 0.00463872]
[-0.46762046 0.02971985 -0.03098581]
[-0.4732132 0.02839518 -0.03700341]
[-0.17814296 0.00926242 -0.00805704]
[-0.18821244 0.01190899 -0.01430339]
[-0.3044056 0.02430441 -0.04632135]
[-0.31113514 0.0230996 -0.05193153]
[-0.16408844 0.0103343 -0.01190965]
[-0.1741932 0.01295652 -0.01808905]
[-0.29113463 0.02519489 -0.04959355]
[-0.29793915 0.02399093 -0.05515092]]
all_unit_vectors()
中的循环可以向量化吗?
【问题讨论】:
“我需要计算两组点之间的所有单位向量。” 示例输出中的行不是单位向量。为什么要将pt_a - pt_b
除以np.linalg.norm([pt_a, pt_b])
?
@WarrenWeckesser 不是吗?我是从***.com/a/52781450/280795 那里得到的(虽然我不清楚v
在那个答案中的样子)
np.linalg.norm([-0.368511, 0.01759667, 0.01684932])
是 0.369...,而不是 1。要获得单位向量,您必须除以 np.linalg.norm(pt_a - pt_b)
。差异pt_a - pt_b
对应于您链接到的答案中的v
,因此您必须将v
的两个出现替换为pt_a - pt_b
。
@WarrenWeckesser 哦,当然。谢谢你把它捡起来。我已经编辑了这个问题,所以没有人会犯同样的错误。
【参考方案1】:
norm
计算为平方和的根,您可以按如下方式实现自己的norm
计算,然后用broadcasting 向量化您的解决方案:
diff = (in_a[:, None] - in_b).reshape(-1, 3)
norm = ((in_a[:, None] ** 2 + in_b ** 2).sum(2) ** 0.5).reshape(-1, 1)
diff / norm
给予:
[[-0.36851098 0.01759667 0.01684932]
[-0.3777128 0.02035861 0.00997706]
[-0.47964868 0.03250422 -0.02628129]
[-0.4851439 0.03115273 -0.03235091]
[-0.35515452 0.01449887 0.01145004]
[-0.36444229 0.01727756 0.00463872]
[-0.46762047 0.02971985 -0.03098581]
[-0.4732132 0.02839518 -0.03700341]
[-0.17814297 0.00926242 -0.00805704]
[-0.18821243 0.01190899 -0.01430339]
[-0.30440561 0.02430441 -0.04632135]
[-0.31113513 0.0230996 -0.05193153]
[-0.16408845 0.0103343 -0.01190965]
[-0.1741932 0.01295652 -0.01808905]
[-0.29113461 0.02519489 -0.04959355]
[-0.29793917 0.02399093 -0.05515092]]
Play.
【讨论】:
以上是关于向量化计算numpy中一组点的所有单位向量的主要内容,如果未能解决你的问题,请参考以下文章