首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个距离矩阵?

创建一个距离矩阵?
EN

Stack Overflow用户
提问于 2015-04-06 23:49:44
回答 7查看 57.6K关注 0票数 35

目前,我正在将数据读入如下所示的数据框中。

代码语言:javascript
复制
City         XCord    YCord   
Boston         5        2
Phoenix        7        3
New York       8        1
.....          .        .

我想从这些数据中创建一个欧几里德距离矩阵,显示所有城市对之间的距离,因此我得到了一个结果矩阵,如下所示:

代码语言:javascript
复制
             Boston    Phoenix   New York
Boston         0        2.236      3.162
Phoenix        2.236      0        2.236
New York       3.162    2.236        0

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-04-07 01:03:17

我认为你对矩阵很有兴趣。

例如:

创建数据:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
          xcord ycord
Boston      5   7
Phoenix     7   3
New York    8   1

使用距离矩阵函数:

代码语言:javascript
复制
 pd.DataFrame(distance_matrix(df.values, df.values), index=df.index, columns=df.index)

结果:

代码语言:javascript
复制
          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
票数 50
EN

Stack Overflow用户

发布于 2017-08-23 08:08:04

如果您不想使用“参与”,您可以通过这样的方式利用列表理解:

代码语言:javascript
复制
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])
票数 15
EN

Stack Overflow用户

发布于 2015-04-07 01:07:10

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

从数学模块导入sqrt函数:

from math import sqrt

假设您的坐标在数据表中的方式如下:

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

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

代码语言:javascript
复制
def dist(a, b):
    d = [a[0] - b[0], a[1] - b[1]]
    return sqrt(d[0] * d[0] + d[1] * d[1])

将结果矩阵初始化为字典:

代码语言:javascript
复制
D = {}

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

D是得到的矩阵。

完整的源代码和打印的结果一起在下面:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29481485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档