2014-11-11 3 views
0

У меня есть куча точек с форматом point = [time, latitude, longitude].Выберите все смежные элементы без копирования массива numpy

Итак, я получил себе Numpy массив, который выглядит примерно так -

points = numpy.array([ 
    [t_0, lat_0, lon_0], 
    [t_1, lat_1, lon_1], 
    [t_2, lat_2, lon_2], 
    ... 
    [t_n, lat_n, lon_n], 
]) 

Теперь мне нужно сделать что-то, что дает мне следующий и предыдущие пункты для каждой из этих точек, как:

next_points = numpy.array([ 
    [t_1, lat_1, lon_1], 
    [t_2, lat_2, lon_2], 
    ... 
    [t_n, lat_n, lon_n], 
    [nan, nan, nan], # Note how `nan` is put where next does not exist 
]) 

prev_points = numpy.array([ 
    [nan, nan, nan], 
    [t_0, lat_0, lon_0], 
    [t_1, lat_1, lon_1], 
    [t_2, lat_2, lon_2], 
    ... 
]) 

Итак, что я могу применить свои функции расстояния -

next_distances = distance_function(points, next_points) 
prev_distances = distance_function(points, prev_points) 

Теперь эта задача появится s в функции, которая вызывается в цикле около 1000 раз,

Было бы хорошо, если бы я мог получить next_points и prev_points без создания копии points.

Есть ли способ сделать это?

+0

Похоже, вы вычисляете одинаковые расстояния дважды, предполагая, что ваша дистанционная функция является коммутативной, то есть 'dist (a, b) == dist (b, a)'. –

+0

Да, но это не имеет значения, потому что 'distance_function', только вычисляет расстояние для уникальных пар, которые еще не находятся в кеше, и кэширует расстояния для более позднего ... так что это не должно быть проблемой .... – Optimus

+0

Если вы «Повторяя массивы точек внутри дистанционной функции, вы можете использовать« itertools.chain » –

ответ

0

Если я правильно понимаю, это как раз о переносе массива:

Если вы nan -pad в points массив с обеих сторон, вы можете сделать

next_points = points[1:] 
prev_points = points[:-1] 

d_next = distance_function(next_points, points[:-1]) 
d_prev = distance_function(points[1:], prev_points) 

Хотя, если это истинное расстояние функции, то вам нужно всего лишь сделать d_next или d_prev и соответственно сменить.

+0

, это было так очевидно, теперь я чувствую себя глупо ... – Optimus

Смежные вопросы