如何确定4个不同节点之间的欧几里德距离

时间:2015-02-20 18:37:43

标签: python

我有输入文件,

Node ID    X    Y
   1       5   10
   2       8   20 
   3       9    5
   4       7   10

第一列显示节点ID,第二列和第三列分别显示X和Y坐标。如何找到另一个节点之间的距离?

2 个答案:

答案 0 :(得分:1)

首先创建字典crd

crd = {}

然后你应该使用readlines阅读你的文件。 在我的情况下,我使用你的原始文本,我使用字符串函数拆分将其分成几行(虽然我认为必须有更好的方法来做到这一点)

for line in a.split('\n'):
    m = map(int,line.split())
    crd[m[0]] = m[1:]

crd
{1: [5, 10], 2: [8, 20], 3: [9, 5], 4: [3, 10]}

最后,以免计算距离

from math import sqrt
dist = lambda d,x,y: sqrt((d[x][0]-d[y][0])**2 + (d[x][1]-d[y][1])**2)

dist(crd,1,2)
10.44030650891055

更新: 如果你需要我建议的所有组合

for i in sorted(crd.keys()):
    for j in sorted(crd.keys()):
        if j>i:
            print i,j,':',dist(crd,i,j)

1 2 : 10.4403065089
1 3 : 6.40312423743
1 4 : 2.0
2 3 : 15.0332963784
2 4 : 11.1803398875
3 4 : 7.81024967591

答案 1 :(得分:0)

首先将数据读入列表列表然后调用函数。

with open("file.txt","r") as f:
    a = [map(int,l.split()) for l in f if l.split()]
    dist(a)
a    
[[1, 5, 10], [2, 8, 20], [3, 9, 5], [4, 3, 10]]    

然后通过使用 itertools combinations()函数,您将获得所有节点对。

def dist(data):
    comb = list(combinations([b[0] for b in data],2))
comb
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

然后是遍历列表并获取输入点的问题

    for (x,y) in comb:
        x1 = data[x-1][1] 
        x2 = data[y-1][1]
        y1 = data[x-1][2] 
        y2 = data[y-1][2]
        d = sqrt((x2-x1)**2 + (y2-y1)**2)
        print "{}-{} dis = {}".format(x,y,d) 

哪个输出:

1-2 dis = 10.4403065089
1-3 dis = 6.40312423743
1-4 dis = 2.0
2-3 dis = 15.0332963784
2-4 dis = 11.1803398875
3-4 dis = 7.81024967591