Общая евклидова длина вектора

#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), поэтому треугольник будет содержать больше элементов