web-dev-qa-db-fra.com

python numpy calcul de la distance euclidienne entre les matrices de vecteurs de ligne

Je suis nouveau sur Numpy et je voudrais vous demander comment calculer la distance euclidienne entre des points stockés dans un vecteur.

Supposons que nous ayons un numpy.array chaque ligne est un vecteur et un seul numpy.array. Je voudrais savoir s'il est possible de calculer la distance euclidienne entre tous les points et ce point unique et de les stocker dans un numpy.array.

Voici une interface:

points #2d list of row-vectors
singlePoint #one row-vector

listOfDistances= procedure( points,singlePoint)

Pouvons-nous avoir quelque chose comme ça? Ou est-il possible d'avoir une commande pour avoir le point unique comme une liste d'autres points et à la fin nous obtenons une matrice de distances?

Merci

22
pacodelumberg

Bien que vous puissiez utiliser la vectorisation, l'approche de @ Karl sera plutôt lente avec les tableaux numpy.

L'approche la plus simple consiste simplement à faire np.hypot(*(points - single_point).T). (La transposition suppose que points est un tableau Nx2, plutôt qu'un 2xN. Si c'est 2xN, vous n'avez pas besoin de .T.

Cependant, c'est un peu illisible, donc vous l'écrivez plus explicitement comme ceci (en utilisant des exemples de données en conserve ...):

import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))

dist = (points - single_point)**2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)
18
Joe Kington

Pour obtenir la distance, vous pouvez utiliser la méthode norm du module linalg dans numpy:

np.linalg.norm(x - y)
10
Christian
import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    
5
Dima

Pour appliquer une fonction à chaque élément d'un tableau numpy, essayez numpy.vectorize .

Pour faire le calcul proprement dit, nous avons besoin de la racine carrée de la somme des carrés des différences (ouf!) Entre les paires de coordonnées dans les deux vecteurs.

Nous pouvons utiliser Zip pour jumeler les coordonnées et sum avec une compréhension pour résumer les résultats. Cela ressemble à:

sum((x - y) ** 2 for (x, y) in Zip(singlePoint, pointFromArray)) ** 0.5
2
Karl Knechtel
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))   
distance = euclid_dist(single_point,points)

def euclid_dist(t1, t2):
    return np.sqrt(((t1-t2)**2).sum(axis = 1))
0
rombi