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
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)
Pour obtenir la distance, vous pouvez utiliser la méthode norm du module linalg dans numpy:
np.linalg.norm(x - y)
import numpy as np
def distance(v1, v2):
return np.sqrt(np.sum((v1 - v2) ** 2))
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
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))