#python #numpy #math #euclidean-distance
#питон #тупой #математика #евклидово расстояние
Вопрос:
Учитывая набор векторных точек, каков эффективный способ вычисления общей евклидовой длины (суммы евклидовых значений между всеми точками). Я думаю о:
from scipy.spatial.distance import cdist
import numpy as np
a = np.array([[1, 1], [2, 3], [4, 4]])
length = np.diag(cdist(a, a), 1).sum()
Есть ли что-нибудь более элегантное?
Комментарии:
1. вы имеете в виду общую длину вектора или расстояние между всеми точками? Для последнего вы должны вычислить матрицу расстояний, установить нижний или верхний треугольник равным нулю и суммировать остальное.
2. общая длина вектора Euc(p2 — p1) Euc(p3 — p2)
Ответ №1:
Если Euc(p2-p1) Euc(p3-p2)
это то, что вам нужно, то ваш подход неверен. Вы ищете:
length = np.sqrt( ((a[1:]-a[:-1])**2).sum(-1)).sum()
Ответ №2:
Используйте pdist
, который изначально сохраняет только верхний треугольник
from scipy.spatial.distance import pdist
import numpy as np
a = np.array([[1, 1], [2, 3], [4, 4]])
length = pdist(a).sum()
Комментарии:
1. извините за путаницу в комментарии, общая длина вектора в 3 балла равна: Euc (p2 — p1) Euc (p3 — p2) без Euc (p3 — p1), поэтому треугольник будет содержать больше элементов