Как изменить порядок значений координат, используя евклидово расстояние в Python? - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу изменить порядок координат на основе евклидова расстояния.Например, у меня есть координаты:

1 2 
2 1 
1 3
1 9
6 9
3 5
6 8
4 5
7 9

Я получил евклидово расстояние первой координаты с другой координатой:

Со следующим кодом:

with open("../data comparision project/testfile.txt") as f:

    # for splitting the text file into to lists of list
    my_list = [[x for x in line.strip().split(' ')] for line in f
    index = 0

    # empty list to store distances.
    euclidean_distance_list = []
    for list_of_item in my_list:
        plot1=my_list[0]
        plot2=my_list[index]
        euclidean_distance=math.sqrt((float(plot1[0])-float(plot2[0]))**2 + (float(plot1[1])-float(plot2[1]))**2)
        index=index+1

    # Out of for loop
    sorted_list=sorted(euclidean_distance_list)
    print(sorted_list)

Это генерируетследующий вывод:

[0.0, 1.0, 1.4142135623730951, 3.605551275463989, 4.242640687119285, 7.0, 7.810249675906654, 8.602325267042627, 9.219544457292887]

Теперь я хочу изменить исходное значение координат на основе этих расстояний так, чтобы оно было:

1 2
1 3
1 9
2 1
3 5
4 5
6 8
6 9
7 9

Может кто-нибудь помочь мне с кодом Python.Iрассчитали расстояние, но не смогли получить список с отсортированными значениями координат.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Вы хотите отсортировать список на основе пользовательского компаратора.

Проверьте необязательный аргумент key для функции сортировки.Вы можете поставить собственный компаратор как key.

https://docs.python.org/3/howto/sorting.html

1 голос
/ 01 апреля 2019

Чтобы заполнить немного подробнее - предположим, что вы уже написали функцию:

def euclidean_distance(a, b):
    # does the math and gives the distance between coordinates a and b.
    # If you got the values some other way - better reorganize the code
    # first so that you have a function like this :)

Мы можем использовать functools.partial, чтобы создать функцию для расстояний от заданной точки:

distance_from_a = functools.partial(euclidean_distance, points[0])

, а затем остальная часть логики встроена в собственную сортировку Python :

sorted(points, key=distance_from_a)
0 голосов
/ 01 апреля 2019

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

import numpy as np

def euclidian_distance(a, b):
  return np.linalg.norm(a - b)

coords = np.array([[1,2], 
                   [2,1], 
                   [1,3],
                   [1,9],
                   [6,9],
                   [3,5],
                   [6,8],
                   [4,5],
                   [7,9]])

coords = sorted(coords, key=lambda point: euclidian_distance(point, coords[0]))
print(np.matrix(coords)) # matrix is only for formatting for readability purposes

Вывод:

[[1 2]
 [1 3]
 [2 1]
 [3 5]
 [4 5]
 [1 9]
 [6 8]
 [6 9]
 [7 9]]

Комуобъясните, почему вышеприведенный вывод отличается от ОП.Это потому, что пример вывода OP фактически не упорядочен по расстоянию, как они описали, что они хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...