2015-04-06 3 views
3

В настоящее время я читаю данные в 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 

Есть много других городов и координаты в моем фактический кадр данных, поэтому мне нужно иметь возможность как-то перебрать все пары городов и создать матрицу расстояний, подобную той, которую я показал выше, но я не уверен, как соединить все ссылки вместе и применить формулу Euclidean Distance ? Любая помощь будет оценена по достоинству.

+0

У вас есть код уже?Пожалуйста, предоставьте хотя бы код, в котором вы читали эти расстояния в памяти, чтобы иметь что-то вроде шнуров [boston] = (5, 2) – pkacprzak

+0

Прямо сейчас я читаю CSV-файл следующим образом: Data = pd.read_csv ('C: \ Users \ Джерри \ Desktop \ 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

Я дам метод в чистом питоне.

Импорт 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 у: 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]) 
Смежные вопросы