matriz 2D numpy- ¿Cómo mejorar el rendimiento en este caso?

Llegué a saber que el número es lento para los accesos de elementos individuales para una matriz muy grande. La siguiente parte del código tarda aproximadamente 7-8 minutos en ejecutarse. El tamaño de la matriz es de aproximadamente 3000 * 3000.

import numpy as np
................
................
ArrayLength=len(Coordinates)
AdjMatrix=np.zeros((len(Angles),len(Angles)))
for x in range(0, Arraylength):
    for y in range(x+1, Arraylength-x):
        distance=Distance(Coordinates[x],Coordinates[y)
            if(distance<=radius)
                AdjMatrix[x][y]=distance
                AdjMatrix[y][x]=distance

Básicamente, estoy tratando de construir una matriz de adyacencia para un gráfico que consta de unos 3000 nodos. ¿Puede alguien ayudarme a hacer esta manera de numpy? ¿O alguna alternativa?

Edición: Aquí está la función Distancia ()

Def Distance(p1,p2):
    distance=np.sqrt(np.square(p1[0]-p2[0])+np.square(p1[1]-p2[1]))
    return distance

Por cierto, estoy pasando las coordenadas como tuplas. Como en p [0] = coordenada x y p [1] = coordenada y.

Respuestas a la pregunta(1)

Su respuesta a la pregunta