Существует ли лучший и более быстрый способ преобразования матрицы сжатого расстояния Scipy в матрицу разреженного расстояния Scipy под порогом? - PullRequest
2 голосов
/ 04 июля 2019

Я пытаюсь вычислить евклидово расстояние между n-мерными точками, а затем получить матрицу разреженных расстояний всех точек, где расстояние находится ниже установленного порога.

У меня уже есть метод, работающий, но он слишком медленный.Для 12000 точек в 3D требуется около 8 секунд.Остальная часть программы выполняется менее чем за секунду, поэтому это является основным узким местом.Это будет выполнено сотни раз, поэтому улучшение этого шага приведет к значительному увеличению производительности.

Это моя текущая реализация.

def make_sparse_dm(points: np.array, thresh):
    n = points.shape[0]
    distance_matrix = 
        spatial.distance.squareform(spatial.distance.pdist(points))   
        # pairwise_distances(points)
    [i, j] = np.meshgrid(np.arange(n), np.arange(n))
    points_under_thresh = distance_matrix <= thresh
    i = i[points_under_thresh]
    j = j[points_under_thresh]
    v = distance_matrix[points_under_thresh]
    return sparse.coo_matrix((v, (i, j)), shape=(n, n)).tocsr()

Затем выходные данные передаются в библиотеку, котораянамного быстрее, когда входные данные в виде матрицы рассеянного разреженного расстояния.

...