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