Рассчитать евклидово расстояние между всеми элементами в списке списков python - PullRequest
0 голосов
/ 28 января 2020

У меня есть список списков. Я хочу найти евклидово расстояние между всеми парами и самим собой и создать массив 2D numpy. Расстояние между собой будет иметь 0 на месте и значение, когда пары различны. Пример списка списков: [[0, 42908],[1, 3],[1, 69],[1, 11],[0, 1379963888],[0, 1309937401],[0, 1],[0, 3],[0, 3],[0, 77]] Я хочу получить результат

  0 1 2 3 4 5 6 7 8
0 0 x x x x x x x x
1   0 x x x x x x x
2     0 x x x x x x 
3       0 x x x x x
4 .................
5 .................
6 .................
7 .................
8 .................

x, представляющий значения различий. Периоды означают, что результат должен следовать, как показано в матрице. Мне нужна помощь с кодом в python. Число 0,1,2 et c в строках и столбцах определяет индекс внутреннего списка.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете использовать numpy напрямую для расчета расстояний:

pts = [[0, 42908],[1, 3],[1, 69],[1, 11],[0, 1379963888],[0, 1309937401],[0, 1],[0, 3],[0, 3],[0, 77]]
x = np.array([pt[0] for pt in pts])
y = np.array([pt[1] for pt in pts])
np.sqrt(np.square(x - x.reshape(-1,1)) + np.square(y - y.reshape(-1,1)))
0 голосов
/ 28 января 2020

Отличный ответ от BMW. Другое возможное решение, использующее понимание списка, следующее:

import numpy as np
a=[[0, 42908],[1, 3],[1, 69],[1, 11],[0, 1379963888],[0, 1309937401],[0, 1],[0, 3],[0, 3],[0, 77]]
# generate all the distances with a list comprehension
b=np.array([  ((a[i][0]-a[j][0])**2 + (a[i][1]-a[j][1])**2)**0.5 for i in range(len(a)) for j in range(i,len(a))])

n = len(b)
# generate the indexes of a upper triangular matrix
idx = np.triu_indices(n)
# initialize a matrix of n*n with zeros
matrix = np.zeros((n,n)).astype(int)
# assign to such matrix the results of b
matrix[idx] = b
...