微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Python有效地计算数组中所有点之间的距离

如何解决使用Python有效地计算数组中所有点之间的距离

我有一个N=3点的列表,作为输入: points = [[1,1],[2,2],[4,4]]

我编写了这段代码来计算列表points中所有元素之间所有可能的距离,如dist = min(∣x1−x2∣,∣y1−y2∣)

distances = []
for i in range(N-1):
    for j in range(i+1,N):
        dist = min((abs(points[i][0]-points[j][0]),abs(points[i][1]-points[j][1])))
        distances.append(dist)
print(distances)

我的输出将是数组distances,其中保存了所有距离:[1,3,2]

它可以与N=3一起正常工作,但是我想以更有效的方式进行计算,并且可以自由设置N=10^5。 我也尝试使用numpyscipy,但是在替换循环和使用正确的方法时遇到了一些麻烦。

有人可以帮我吗?预先感谢

解决方法

numpythonic 解决方案

要使用 Numpy 的全部功能来计算距离,并进行计算 快得多:

  1. 将您的转换为 Numpy 数组:

     pts = np.array(points)
    
  2. 然后运行:

     dist = np.abs(pts[np.newaxis,:,:] - pts[:,np.newaxis,:]).min(axis=2)
    

这里的结果是一个正方形数组。 但是,如果您想获得对角线上方的元素的列表, 就像您的代码生成一样,您可以运行:

dist2 = dist[np.triu_indices(pts.shape[0],1)].tolist()

我为以下 9 点运行了这段代码:

points = [[1,1],[2,2],[4,4],[3,5],8],10],7],9],7]]

对于上述数据,保存在 dist (完整数组)中的结果为:

array([[0,1,3,2,3],[1,0],0]])

,对角线上方的元素列表为:

[1,2]

我的代码有多快

事实证明,即使对于像我这样使用的小样本( 9 点),我的代码的运行速度快2倍。对于18点样本 (此处未显示)-快 6 倍。

即使我的功能已经获得了这种速度差异 计算出“比需要多2倍”,即生成一个完整 数组,而结果的较低对角线部分为“镜像 视图”(对您的代码进行计算)。

对于更大数量的点,差异应该更大。 对更大的分数样本(例如100分数)进行测试,并写出如何 我的代码快了很多倍。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。