У меня есть массив X трехмерных координат из N точек (N * 3), и я хочу вычислить расстояние по Евклиду между каждой парой точек.
Я могу сделать это, перебирая X и сравнивая их с порогом.
coords = array([v.xyz for v in vertices])
for vertice in vertices:
tests = np.sum(array(coords - vertice.xyz) ** 2, 1) < threshold
closest = [v for v, t in zip(vertices, tests) if t]
Возможно ли это сделать за одну операцию? Я вспоминаю линейную алгебру 10 лет назад и не могу найти способ сделать это.
Вероятно, это должен быть трехмерный массив (точка a, точка b, ось), а затем суммироваться по axis
измерению.
edit: сам нашел решение, но оно не работает с большими наборами данных.
coords = array([v.xyz for v in vertices])
big = np.repeat(array([coords]), len(coords), 0)
big_same = np.swapaxes(big, 0, 1)
tests = np.sum((big - big_same) ** 2, 0) < thr_square
for v, test_vector in zip(vertices, tests):
v.closest = self.filter(vertices, test_vector)