Cálculo de la distancia euclidiana de Python Numpy entre matrices de vectores de fila

Soy nuevo en Numpy y me gustaría preguntarle cómo calcular la distancia euclidiana entre los puntos almacenados en un vector.

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 solo número.

Aquí hay 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 único punto como una lista de otros puntos y al final obtenemos una matriz de distancias?

Gracias

Si bien puedes usar vectorizar, el enfoque de @ Karl será bastante lento con matrices numpy.

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

Sin embargo, esto es un poco ilegible, por lo que lo escribe de manera más explícita así (utilizando algunos datos de ejemplo enlatados …):

 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) 
 import numpy as np def distance(v1, v2): return np.sqrt(np.sum((v1 - v2) ** 2)) 

Para obtener la distancia, puede utilizar el método normal del módulo linalg en numpy:

 np.linalg.norm(x - y) 

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

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

Podemos usar zip para emparejar las coordenadas, y sum con una comprensión para resumir los resultados. Eso parece como:

 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))