2010-12-06 563 views
12

Soy nuevo en Numpy y me gustaría preguntarte cómo calcular la distancia euclidiana entre los puntos almacenados en un vector.python numpy euclidean cálculo de distancia entre matrices de vectores de fila

Supongamos que tenemos un numpy.array cada fila es un vector y un solo numpy.array. Me gustaría saber si es posible calcular la distancia euclidiana entre todos los puntos y este único punto y almacenarlos en un numpy.array.

Aquí es una interfaz:

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

listOfDistances= procedure(points,singlePoint) 

¿Podemos tener algo como esto? ¿O es posible tener un comando para tener el punto único como una lista de otros puntos y al final obtenemos una matriz de distancias?

Gracias

+1

Aunque se desea calcular la distancia entre un punto y un conjunto de puntos, Creo que scipy.spatial.distance.cdist todavía funciona. Tienes 2 colecciones, una de las cuales tiene solo 1 elemento. http://stackoverflow.com/questions/1871536/euclidean-distance-between-points-in-two-different-numpy-arrays-not-within –

+0

@JimRaynor +1 Era exactamente lo que necesitaba :) – ocean800

Respuesta

16

Mientras que usted puede usar vectorize, el enfoque de @ Karl será bastante lento con las matrices numpy.

El enfoque más fácil es simplemente hacer np.hypot(*(points - single_point).T). (La transposición asume que los puntos son un arreglo Nx2, en lugar de un 2xN. Si es 2xN, no necesita el .T.

Sin embargo, esto es un poco ilegible, por lo que lo escribe de manera más explícita (usando algunos datos de ejemplo en lata ...):

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

Para aplicar una función a cada elemento de una matriz numpy, tratar numpy.vectorize.

Para hacer el cálculo real, necesitamos la raíz cuadrada de la suma de cuadrados de diferencias (¡oh!) Entre los pares de coordenadas en los dos vectores.

Podemos usar zip para emparejar las coordenadas, y sum con una comprensión para sumar los resultados. Eso se ve así:

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

¿Puede explicarlo? más sobre lo que hace tu código? – Athafoud

+0

Eso es lo mismo que el anterior pero en una línea –

0

para obtener la distancia se puede utilizar el método de la norma del módulo linalg en numpy:

np.linalg.norm(x - y) 
Cuestiones relacionadas