Есть ли способ получить доступ к матрицам, используя (x, y) в качестве индекса - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу сгенерировать матрицу, которая хранит расстояние между каждой точкой и каждой другой точкой. Я хочу получить доступ к этому значению расстояния в матрице, используя две координаты.

Как и на рисунке ниже, я хочу иметь возможность доступа к расстоянию, используя точки в качестве индекса.

матрица [точка а, точка b] = расстояние между двумя точками

The matrix with the euclidean distance between points

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Одним из решений является использование модуля pandas.

  • Вы можете определить имя столбца и индекса с помощью " координат точек ".
  • Заполните данные, используя scipy.spatial.distance.cdist
  • Доступ ко всем расстояниям из одной точки, используя df["[x, y]"]
  • Доступ к указанному c расстоянию используя iloc для столбца

Полный код + иллюстрация

# import modules
import pandas as pd
from scipy.spatial.distance import cdist

# input points
points = [[1, 2], [2, 3], [3, 4], [5, 6], [9, 10]]

# Create dataframe
df = pd.DataFrame(cdist(points, points),
     columns=[str(p) for p in points],
     index=[str(p) for p in points])
print(df)
#             [1, 2]    [2, 3]    [3, 4]    [5, 6]    [9, 10]
# [1, 2]    0.000000  1.414214  2.828427  5.656854  11.313708
# [2, 3]    1.414214  0.000000  1.414214  4.242641   9.899495
# [3, 4]    2.828427  1.414214  0.000000  2.828427   8.485281
# [5, 6]    5.656854  4.242641  2.828427  0.000000   5.656854
# [9, 10]  11.313708  9.899495  8.485281  5.656854   0.000000

# select column "[2, 3]"
print(df["[2, 3]"])
# [1, 2]     1.414214
# [2, 3]     0.000000
# [3, 4]     1.414214
# [5, 6]     4.242641
# [9, 10]    9.899495

# get distance between point [2 3] and [1 2]
print(df["[2, 3]"].loc["[1, 2]"])
# 1.4142135623730951

Надеюсь, что поможет

0 голосов
/ 27 апреля 2020

Если вы запросите решение в numpy, вы можете использовать предложение , где . Вот образец:

import numpy as np
X = np.array([[1,2],[2,3],[3,4],[5,6],[9,10]])
distance_matrix = np.zeros((X.shape[0],X.shape[0]))
# distance matrix
distance_matrix[np.where(X==[1,2])[0][0],np.where(X==[1,2])[0][0]] = 0
distance_matrix[np.where(X==[1,2])[0][0],np.where(X==[2,3])[0][0]] = np.linalg.norm(np.array([1,2]) - np.array([2,3]))
distance_matrix[np.where(X==[2,3])[0][0],np.where(X==[1,2])[0][0]] = np.linalg.norm(np.array([1,2]) - np.array([2,3]))
...