如何在Python中迭代坐标列表并计算它们之间的距离

时间:2014-04-15 14:04:54

标签: python

我的列表有20个坐标(x和y坐标)。我可以计算任意两个坐标之间的距离,但是我很难编写一个算法来迭代列表并计算第一个节点和每个其他节点之间的距离。例如,

ListOfCoordinates = [(1,2), (3,4), (5,6), (7,8), (9,10), (11,12)]

在这种情况下,我需要一个for循环,它将对列表进行交互并计算第一个坐标和第二个坐标之间的距离,第一个坐标和第三个坐标之间的距离等。我需要一个算法来帮助我,然后我将它转换为python代码。感谢

感谢您的反馈。它很有用。

4 个答案:

答案 0 :(得分:6)

每当你需要面向组合学的东西时(“我需要第一个和第二个,然后是第一个和第三个,然后......”),itertools模块可能有你需要的东西。

from math import hypot

def distance(p1,p2):
    """Euclidean distance between two points."""
    x1,y1 = p1
    x2,y2 = p2
    return hypot(x2 - x1, y2 - y1)

from itertools import combinations

list_of_coords = [(1,2), (3,4), (5,6), (7,8), (9,10), (11,12)]

[distance(*combo) for combo in combinations(list_of_coords,2)]
Out[29]: 
[2.8284271247461903,
 5.656854249492381,
 8.48528137423857,
 11.313708498984761,
 14.142135623730951,
 2.8284271247461903,
 5.656854249492381,
 8.48528137423857,
 11.313708498984761,
 2.8284271247461903,
 5.656854249492381,
 8.48528137423857,
 2.8284271247461903,
 5.656854249492381,
 2.8284271247461903]

编辑:你的问题有点令人困惑。以防你只希望第一点与其他点进行比较:

from itertools import repeat

pts = [(1,2), (3,4), (5,6), (7,8), (9,10), (11,12)]

[distance(*pair) for pair in zip(repeat(pts[0]),pts[1:])]
Out[32]: 
[2.8284271247461903,
 5.656854249492381,
 8.48528137423857,
 11.313708498984761,
 14.142135623730951]

但通常在这类问题中你关心所有组合,所以我会把第一个答案留在那里。

答案 1 :(得分:0)

In [6]: l = [(1,2), (3,4), (5,6), (7,8), (9,10), (11,12)]

In [7]: def distance(a, b):                              
    return (a[0] - b[0], a[1] - b[1])
   ...: 

In [8]: for m in l[1:]:                                  
    print(distance(l[0], m))
   ...:     
(-2, -2)
(-4, -4)
(-6, -6)
(-8, -8)
(-10, -10)

当然,您必须根据自己的需要调整distance

答案 2 :(得分:0)

您可以创建一个distance函数,它将两个元组(坐标对)作为参数。

def distance(p1, p2):
    return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

由于您只需要一个算法来计算第一个节点与每个其他节点之间的距离,所以创建一个循环遍历每个ListOfCoordinates的循环:

for i in range(1, len(ListOfCoordinates)):
    # you can use print or return, depending on your needs
    print distance(ListOfCoordinates[0], ListOfCoordinates[i])

答案 3 :(得分:0)

我想要一个单行脚本来执行此操作。以下脚本为我完成了工作。

import numpy as np
yd = [(1,2), (3,4), (5,6), (7,8), (9,10), (11,12)]
distances_matrix = np.array([np.linalg.norm((item*np.ones((len(yd),len(item))))-yd,axis=1) for item in yd])

print(distances_matrix)

output:
[[ 0.          2.82842712  5.65685425  8.48528137 11.3137085  14.14213562]
 [ 2.82842712  0.          2.82842712  5.65685425  8.48528137 11.3137085 ]
 [ 5.65685425  2.82842712  0.          2.82842712  5.65685425  8.48528137]
 [ 8.48528137  5.65685425  2.82842712  0.          2.82842712  5.65685425]
 [11.3137085   8.48528137  5.65685425  2.82842712  0.          2.82842712]
 [14.14213562 11.3137085   8.48528137  5.65685425  2.82842712  0.        ]]


#Distance between coordinates with indices 2 and 4
print(distance_matrix[2,4])
output:
5.656854249492381

注意:在这里,我使用的是仅通过Numpy计算的欧几里得距离。在大多数情况下,此解决方案都应适用。但是,当阵列/列表太大且在内存中复制相同副本时,不建议这样做。