2010-12-06 56 views
12

Je suis nouveau à Numpy et je voudrais vous demander comment calculer la distance euclidienne entre les points stockés dans un vecteur. Supposons que nous avons 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 seul point et de les stocker dans un tableau numpy.array.python numpy euclidien distance calcul entre les matrices de vecteurs de ligne

Voici une interface:

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

listOfDistances= procedure(points,singlePoint) 

Peut-on 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

+1

Bien que vous voulez calculer la distance entre un point et un ensemble de points, Je pense que scipy.spatial.distance.cdist fonctionne toujours. Vous avez 2 collections, dont une a seulement 1 élément. http://stackoverflow.com/questions/1871536/francais-de-distance-eulement-dans-les-points-de-two-different-numpy-arrays-not-within –

+0

@JimRaynor +1 Était exactement ce dont j'avais besoin :) – ocean800

Répondre

16

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

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

Cependant, ceci est un peu illisible, donc vous l'écrivez plus explicitement comme ceci (en utilisant certaines données par exemple 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) 
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 2 vecteurs.

Nous pouvons utiliser zip pour coupler 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 
3
import numpy as np 
def distance(v1, v2): 
    return np.sqrt(np.sum((v1 - v2) ** 2))  
+1

Pouvez-vous expliquer plus sur ce que fait votre code? – Athafoud

+0

C'est le même que ci-dessus, mais en une seule ligne –

0

pour obtenir la distance que vous pouvez utiliser la méthode de la norme du module linalg dans numpy:

np.linalg.norm(x - y)