/ / Alternativa de Python para calcular la distancia por pares entre dos conjuntos de 2d puntos [duplicado]: python, algoritmo, numpy, matriz, distancia euclidiana

Alternativa de Python para calcular la distancia de pares entre dos conjuntos de 2d puntos [duplicados]: python, algoritmo, numpy, matriz, distancia euclidiana

En Matlab existe la pdist2 mando. Dada la matriz mx2 y la matriz nx2, cada fila de matrices representa una 2d punto. Ahora quiero crear un mxn matriz tal que (i,j) elemento representa la distancia desde ipunto de mx2 matriz a jpunto de nx2 matriz. Simplemente llamo al comando pdist2(M,N).

Estoy buscando una alternativa a esto en python. Por supuesto, puedo escribir 2 para bucles, pero como estoy trabajando con 2 matrices numpy, usar para bucles no siempre es la mejor opción. ¿Hay un comando optimizado para esto en el universo de Python? Básicamente estoy pidiendo python alternativa a MATLAB "s pdist2.

Respuestas

5 para la respuesta № 1

Usted está buscando el cdist Función de scipy. Calculará las distancias por pares (euclídeas por defecto) entre dos conjuntos de matrices n-dimensionales.

from scipy.spatial.distance import cdist
import numpy as np

X = np.arange(10).reshape(-1,2)
Y = np.arange(10).reshape(-1,2)

cdist(X, Y)
[[  0.           2.82842712   5.65685425   8.48528137  11.3137085 ]
[  2.82842712   0.           2.82842712   5.65685425   8.48528137]
[  5.65685425   2.82842712   0.           2.82842712   5.65685425]
[  8.48528137   5.65685425   2.82842712   0.           2.82842712]
[ 11.3137085    8.48528137   5.65685425   2.82842712   0.        ]]

0 para la respuesta № 2

Usted debe comprobar el pairwise_distances método de la scikit-learn paquete.

sklearn.metrics.pairwise.pairwise_distances(X, Y=None, metric="euclidean", n_jobs=1, **kwds)

Mas informacion en http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html


0 para la respuesta № 3

Si su matriz no es demasiado grande, debería hacerlo sin usar otras librerías. Si la matriz es grande, este método será un poco lento y requiere mucha memoria.

mx2 = np.random.randint(1,9,5)
nx2 = np.random.randint(1,9,3)
mx2
Out[308]: array([2, 3, 4, 8, 7])
nx2
Out[309]: array([3, 2, 2])
mx2[:,None]-nx2
Out[310]:
array([[-1,  0,  0],
[ 0,  1,  1],
[ 1,  2,  2],
[ 5,  6,  6],
[ 4,  5,  5]])