Рассчитайте евклидово расстояние между двумя python массивами - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу написать функцию для вычисления евклидова расстояния между координатами в list_a до каждой из координат в list_b и создания массива расстояний размером a строк по b столбцам (где a - это число координат в list_a, а b - это количество координат в list_b.

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

list_a = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
list_b = np.array([[0,1],[5,4]])

Запуск функции приведет к созданию:

>>> np.array([[0., 5.830951894845301],
              [2.236, 3.605551275463989],
              [5.830951894845301, 0.],
              [5.830951894845301, 2.8284271247461903],
              [4.123105625617661, 2.23606797749979]])

Я пытался запустить ниже

def run_euc(list_a,list_b):
    euc_1 = [np.subtract(list_a, list_b)]
    euc_2 = sum(sum([i**2 for i in euc_1]))
    return np.sqrt(euc_2)

Но я получаю следующую ошибку:

ValueError: operands could not be broadcast together with shapes (5,2) (2,2)

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

Я надеюсь, что это отвечает на вопрос, но это повторение; Минимальное евклидово расстояние между точками в двух разных Numpy массивах, не в пределах

# Import package
import numpy as np

# Define unequal matrices
xy1 = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
xy2 = np.array([[0,1],[5,4]])

P = np.add.outer(np.sum(xy1**2, axis=1), np.sum(xy2**2, axis=1))
N = np.dot(xy1, xy2.T)
dists = np.sqrt(P - 2*N)
print(dists)
0 голосов
/ 26 февраля 2020

Еще один способ сделать это:

np.array(
[np.sqrt((list_a[:,1]-list_b[i,1])**2+(list_a[:,0]-list_b[i,0])**2) for i in range(len(list_b))]
).T

Вывод:

array([[0.        , 5.83095189],
       [2.23606798, 3.60555128],
       [5.83095189, 0.        ],
       [5.83095189, 2.82842712],
       [4.12310563, 2.23606798]])

Этот код может быть написан гораздо более простым и эффективным способом, так что если вы найдете что-нибудь, что может быть улучшен в коде, пожалуйста, дайте мне знать в комментарии.

0 голосов
/ 26 февраля 2020

Здесь вы можете просто использовать np.linalg.norm для вычисления евклидова расстояния. Ваша ошибка связана с тем, что np.subtract ожидает, что два входа имеют одинаковую длину.

import numpy as np

list_a = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
list_b = np.array([[0,1],[5,4]])

def run_euc(list_a,list_b):
    return np.array([[ np.linalg.norm(i-j) for j in list_b] for i in list_a])

print(run_euc(list_a, list_b))

Код выдает:

[[0.         5.83095189]
 [2.23606798 3.60555128]
 [5.83095189 0.        ]
 [5.83095189 2.82842712]
 [4.12310563 2.23606798]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...