2015-04-06 194 views
3

我目前正在将数据读入一个看起来像这样的数据框。创建距离矩阵?

City   XCord YCord 
Boston   5  2 
Phoenix  7  3 
New York  8  1 
.....   .  . 

我想从这个数据显示,所有城市对之间的距离,建立欧氏距离矩阵,所以我得到一个结果矩阵,如:

   Boston Phoenix New York 
Boston   0  2.236  3.162 
Phoenix  2.236  0  2.236 
New York  3.162 2.236  0 

还有更多的城市和坐标我实际的数据框架,所以我需要能够以某种方式迭代所有的城市对,并创建一个距离矩阵,就像我上面显示的距离矩阵,但是我不知道如何将所有的边距组合在一起,并应用欧几里得距离公式?任何帮助,将不胜感激。

+0

你有任何代码了吗?请至少提供一段代码,让您将这些距离读入内存以获得类似于线缆的内容[boston] =(5,2) – pkacprzak

+0

现在即时阅读CSV文件,如下所示:Data = pd.read_csv('C:\ Users \杰里\桌面\ cities.csv') – Jeremy

回答

6

我认为你对distance_matrix感兴趣。

例如:

创建数据:

import pandas as pd 
from scipy.spatial import distance_matrix 

data = [[5, 7], [7, 3], [8, 1]] 
ctys = ['Boston', 'Phoenix', 'New York'] 
df = pd.DataFrame(data, columns=['xcord', 'ycord'], index=ctys) 

输出:

  xcord ycord 
Boston  5 7 
Phoenix  7 3 
New York 8 1 

使用距离矩阵函数:

pd.DataFrame(distance_matrix(df.values, df.values), index=df.index, columns=df.index) 

结果:

  Boston Phoenix  New York 
Boston 0.000000 4.472136 6.708204 
Phoenix 4.472136 0.000000 2.236068 
New York 6.708204 2.236068 0.000000 
0

我会给一个纯python的方法。

导入从数学模块sqrt函数:

from math import sqrt

我们假设你以下面的方式有你的坐标线表:

cords['Boston'] = (5, 2)

定义一个函数来计算两个给定2d点的欧几里德距离:

def dist(a, b): 
    d = [a[0] - b[0], a[1] - b[1]] 
    return sqrt(d[0] * d[0] + d[1] * d[1]) 

初始化所得矩阵作为字典:

D = {} 

for city1, cords1 in cords.items(): 
    D[city1] = {} 
    for city2, cords2 in cords.items(): 
     D[city1][city2] = dist(cords1, cords2) 

d是你的结果矩阵

完整的源是下面具有印刷结果一起:

from math import sqrt 

cords = {} 
cords['Boston'] = (5, 2) 
cords['Phoenix'] = (7, 3) 
cords['New York'] = (8, 1) 

def dist(a, b): 
    d = [a[0] - b[0], a[1] - b[1]] 
    return sqrt(d[0] * d[0] + d[1] * d[1]) 

D = {} 

for city1, cords1 in cords.items(): 
    D[city1] = {} 
    for city2, cords2 in cords.items(): 
     D[city1][city2] = dist(cords1, cords2) 

for city1, v in D.items(): 
    for city2, d in v.items(): 
     print city1, city2, d 

结果:

Boston Boston 0.0 
Boston New York 3.16227766017 
Boston Phoenix 2.2360679775 
New York Boston 3.16227766017 
New York New York 0.0 
New York Phoenix 2.2360679775 
Phoenix Boston 2.2360679775 
Phoenix New York 2.2360679775 
Phoenix Phoenix 0.0 
0

scip中有这个功能Y: scipy.spatial.distance.cdist()

1

,如果你不希望使用SciPy的,你可以用这种方式利用列表理解:

dist = lambda p1, p2: sqrt(((p1-p2)**2).sum()) 
dm = np.asarray([[dist(p1, p2) for p2 in xy_list] for p1 in xy_list])