Вычисление расстояния между (M, N) и (N,) массивами - PullRequest
0 голосов
/ 27 октября 2018

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

import numpy as np
import random
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]
for i in range(10):
    dist = np.linalg.norm(A[i]-B)
    print("Distances: ", dist)

Есть ли способ, с помощью которого я могу использовать расширенную индексацию или любые другие методы для расчета расстояний без использования цикла for?спасибо.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Вы можете вычислить Норму Фробениуса явно:

res = (np.abs(A - B)**2).sum(1)**0.5

Это значение по умолчанию для np.linalg.norm. Вот демо:

np.random.seed(0)
A = np.random.randint(5, size=(10, 5))
B = [1, 3, 5, 2, 4]

res = (np.abs(A - B)**2).sum(1)**0.5

array([4.89897949, 5.38516481, 5.29150262, 5.47722558, 5.        ,
       5.56776436, 6.244998  , 2.23606798, 5.56776436, 4.47213595])
0 голосов
/ 27 октября 2018

Подход № 1: Самый прямой с np.linalg.norm, использующим его axis параметр и также использующим broadcasting, будет -

np.linalg.norm(A-B,axis=1)

Подход# 2: С einsum -

subs = A - B
out = np.sqrt(np.einsum('ij,ij->i',subs,subs))

Подход № 3: Использование формулы (a-b)^2 = a^2 + b^2 - 2ab для использования matrix-multiplication с np.dot и np.inner -

np.sqrt(np.einsum('ij,ij->i',A, A) + np.inner(B,B) - 2*A.dot(B))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...