una - Cálculo de la distancia euclidiana de Python Numpy entre matrices de vectores de fila
sumar dos matrices numpy (5)
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
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 suma de los cuadrados de 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
Para obtener la distancia, puede utilizar el método normal del módulo linalg en numpy:
np.linalg.norm(x - y)
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, así que lo escribes más explícitamente de esta manera (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))
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))