目前,我正在将数据读入如下所示的数据框中。
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在我的实际数据框架中还有更多的城市和坐标,所以我需要能够以某种方式迭代所有的城市对,并创建一个像上面所示的距离矩阵,但是我不知道如何将所有的cites对在一起,并应用欧几里德距离公式。任何帮助都将不胜感激。
发布于 2015-04-07 01:03:17
我认为你对矩阵很有兴趣。
例如:
创建数据:
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发布于 2017-08-23 08:08:04
如果您不想使用“参与”,您可以通过这样的方式利用列表理解:
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])发布于 2015-04-07 01:07:10
我将在纯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.0https://stackoverflow.com/questions/29481485
复制相似问题