Это не то, что я имел в виду. Но спасибо. Это уже решено.

я есть массив пустышек в Python, который содержит много (10k +) трехмерных точек вершин (векторы с координатами [x, y, z]). Мне нужно рассчитать расстояние между всеми возможными парами этих точек.

это легко сделать используя scipy:

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

но я не могу использовать это из-за политики проекта по введению новых зависимостей.

Итак, я придумал этот наивный код:

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 () вычисляет трехмерное расстояние между двумя вершинами, а остальная часть кода просто перебирает вершины в одномерном массиве и для каждого вычисляет расстояние друг от друга в том же массиве и создает двумерный массив расстояний.

Но это очень медленно (в 1000 раз) по сравнению с нативным C-кодом Сципи. Интересно, смогу ли я ускорить его, используя чистый NumPy. по крайней мере, в некоторой степени.

Еще немного информации:https://github.com/scipy/scipy/issues/9172

Кстати, я пробовал PyPy JIT-компилятор, и он был даже медленнее (в 10 раз), чем чистый Python.

ОБНОВЛЕНИЕ: я был в состоянии ускорить вещи немного как это:

    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

Это устраняет внутренний цикл, вычисляя сразу всю строку, что делает вещи довольно быстрыми, но все же заметно медленнее, чем scipy. Так что я все еще смотрю на решение @ Divakar

Ответы на вопрос(2)

Ваш ответ на вопрос