Рассчитать попарно расстояние нескольких траекторий, используя numpy - PullRequest
0 голосов
/ 21 февраля 2020

Учитывая произвольное количество трехмерных траекторий с N точками (временными шагами) каждая, я хотел бы вычислить расстояние между каждой точкой для данного временного шага.

Допустим, мы рассмотрим временной шаг 3 и получим четыре траектории t_0 ... t_3. Точка третьего временного шага траектории 0 задается как t_0 (3). Я хочу рассчитать расстояния следующим образом:

d_0 = norm(t_0(3) - t_1(3))
d_1 = norm(t_1(3) - t_2(3))
d_2 = norm(t_2(3) - t_3(3)) 
d_3 = norm(t_3(3) - t_0(3))

Как вы можете видеть, в нем есть своеобразное круговое поведение (последнее вычисляет расстояние до первого), но это не является строго необходимым.

Я знаю, как написать несколько циклов for и вычислить, что я хочу. То, что я ищу, - это концепция или, может быть, реализация в numpy (или комбинации np-функций), которая может выполнять эту логику c, просто используя правую ось и другие numpy magi c.

Вот несколько примеров траекторий

import numpy as np

TIMESTEP_COUNT = 70
origin = np.array([0, 0, 0])

run1_direction = np.array([1, 0, 0]) / np.linalg.norm([1, 0 ,0])
run2_direction = np.array([0, 1, 0]) / np.linalg.norm([0, 1, 0])
run3_direction = np.array([0, 0, 1]) / np.linalg.norm([0, 0, 1])
run4_direction = np.array([1, 1, 0]) / np.linalg.norm([1, 1, 0])

run1_trajectory = [origin]
run2_trajectory = [origin]
run3_trajectory = [origin]
run4_trajectory = [origin]

for t in range(TIMESTEP_COUNT - 1):
    run1_trajectory.append(run1_trajectory[-1] + run1_direction)
    run2_trajectory.append(run2_trajectory[-1] + run2_direction)
    run3_trajectory.append(run3_trajectory[-1] + run3_direction)
    run4_trajectory.append(run4_trajectory[-1] + run4_direction)

run1_trajectory = np.array(run1_trajectory)
run2_trajectory = np.array(run2_trajectory)
run3_trajectory = np.array(run3_trajectory)
run4_trajectory = np.array(run4_trajectory)

... приводит к следующему изображению: enter image description here

Заранее спасибо !!

РЕДАКТИРОВАТЬ: мой вопрос отличается от предлагаемого ответа ниже, потому что я не хочу рассчитывать матрицу полного расстояния. Мой al go должен работать только с расстояниями между последовательными пробегами.

1 Ответ

1 голос
/ 21 февраля 2020

Я думаю, что вы можете сложить их вертикально, чтобы получить массив формы 4 x n_timesteps, а затем использовать np.roll, чтобы сделать разницу на каждом временном шаге, а именно:

r = np.vstack([t0,t1,t2,t3])
r - np.roll(r,shift=-1,axis=0)

Numeri c пример :

t0,t1,t2,t3 = np.random.randint(1,10, 5), np.random.randint(1,10, 5), np.random.randint(1,10, 5), np.random.randint(1,10, 5)
r = np.vstack([t0,t1,t2,t3])
r
array([[1, 7, 7, 6, 2],
       [9, 1, 2, 3, 6],
       [1, 1, 6, 8, 1],
       [2, 9, 5, 9, 3]])

r - np.roll(r,shift=-1,axis=0)
array([[-8,  6,  5,  3, -4],
       [ 8,  0, -4, -5,  5],
       [-1, -8,  1, -1, -2],
       [ 1,  2, -2,  3,  1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...