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 i
punto de mx2
matriz a j
punto 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 № 1Usted 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]])