创建距离矩阵?

时间:2015-04-06 23:49:44

标签: python numpy dataframe

我目前正在将数据读入一个看起来像这样的数据框。

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

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

5 个答案:

答案 0 :(得分:16)

我认为您对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

答案 1 :(得分:6)

如果你不想使用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])

答案 2 :(得分:3)

我将在纯python中给出一个方法。

从数学模块导入sqrt函数:

from math import sqrt

假设您以下列方式在cords表中使用坐标:

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

答案 3 :(得分:0)

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

n_df=(df.values)
n_df

(df.values).shape

matrix=np.zeros(((df.values).shape[0],(df.values).shape[0]))
matrix


for i in range((df.values).shape[0]):
    for j in range((df.values).shape[0]):
        matrix[i,j]=np.sqrt(np.sum((n_df[i]-n_df[j])**2))
        #print('i',i,'j',j)


print(matrix)

答案 4 :(得分:-1)

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