Distancia espacial vectorizada en python usando numpy

i tengo una matriz numpy en python que contiene lotes (10k +) de puntos de vértice 3D (vectores con coordenadas [x, y, z]). Necesito calcular la distancia entre todos los pares posibles de estos puntos.

es fácil de hacer usando scipy:

import scipy
D = spdist.cdist(verts, verts)

pero no puedo usar esto debido a la política del proyecto sobre la introducción de nuevas dependencias.

Así se me ocurrió este código ingenuo:

def vert_dist(self, A, B):
    return ((B[0]-A[0])**2+(B[1]-A[1])**2+(B[2]-A[2])**2)**(1.0/2)

# Pairwise distance between verts
#Use SciPy, otherwise use fallback
try:
    import scipy.spatial.distance as spdist
    D = spdist.cdist(verts, verts)
except ImportError:
    #FIXME: This is VERY SLOW:
    D = np.empty((len(verts), len(verts)), dtype=np.float64)
    for i,v in enumerate(verts):
        #self.app.setStatus(_("Calculating distance %d of %d (SciPy not installed => using SLOW AF fallback method)"%(i,len(verts))), True)
        for j in range(i,len(verts)):
            D[j][i] = D[i][j] = self.vert_dist(v,verts[j])

vert_dist () calcula la distancia 3D entre dos vértices y el resto del código simplemente itera sobre los vértices en la matriz 1D y para cada uno calcula la distancia entre sí en la misma matriz y produce una matriz 2D de distancias.

Pero eso es extremadamente lento (1000 veces) en comparación con el código C nativo de scipy. Me pregunto si puedo acelerarlo usando puro numpy. al menos hasta cierto punto.

Algo más información:https: //github.com/scipy/scipy/issues/917

BTW He probado el compilador PyPy JIT y fue incluso más lento (10 veces) que Python puro.

UPDATE: pude acelerar las cosas un poco así:

    def vert_dist_matrix(self, verts):
            #FIXME: This is VERY SLOW:
            D = np.empty((len(verts), len(verts)), dtype=np.float64)
            for i,v in enumerate(verts):
                    D[i] = D[:,i] = np.sqrt(np.sum(np.square(verts-verts[i]), axis=1))
            return D

Esto elimina el bucle interno al calcular toda la fila a la vez, lo que hace que las cosas sean bastante más rápidas, pero aún más lentas que las de scipy. Así que todavía miro la solución de @ Divakar

Respuestas a la pregunta(2)

Su respuesta a la pregunta