2013-05-20 3 views
2

Я хочу интерполировать значения в массиве 1D из нерегулярной сетки в регулярную сетку. Например, представьте, что исходные данные имеют значение при неправильном разнесенных X координате:1D нерегулярная сетка до 1d регулярной сетки

source_x = np.asarray([127.3, 759.4, 1239.1, ..., 98430.1]) 
source_y = whatever(x) # No really a function but a set of masurements 

Сетка назначения также 1D, но координаты X регулярно разнесены вдоль оси:

dest_x = np.arange(250, 100000, 500) 

Я хочу найти расстояние и индекс двух ближайших элементов в исходном source_x координатах массива для каждой точки назначения dest_x координат массива. Например:

dest_x[0] = 250 
indices = [0, 1] 
distances = [250-127.3, 759.4-250] 

Это должно быть сделано как атомная операция, если это возможно.

Моя первая идея состояла в том, чтобы использовать scipy.spatial.KDTree, но это не позволяет получать данные 1D. Любые другие варианты?

EDIT

Существует «некрасиво» вариант, который включает в себя «пустышку» координат нулей, что позволяет использовать scipy.spatial.KDTree:

source_x = np.asarray([127.3, 759.4, 1239.1, ..., 98430.1]) 
source_dummy = np.zeros_like(source_x) 

dest_x = np.arange(250, 100000, 500) 
dest_dummy = np.zeros_like(dest_x) 

src = np.vstack((source_x, source_dummy)).T 
dst = np.vstack((dest_x, dest_dummy)).T 

tree = KDTree(src) 
distances, indices = tree.query(dst, 2) 

Однако мне не нравится такой подход, что много. ..

+2

Для линейной интерполяции просто используйте 'numpy.interp()'. Если вам нужны сами индексы, используйте 'numpy.searchsorted()'. Единственный сложный бит - это обработка значений сетки, находящихся за пределами вашего диапазона данных. Расстояния легко вычислить, как только у вас есть индексы. –

+0

Спасибо за ваш ответ, «numpy.searchsorted» - хороший подход для поиска индексов в массивах 1D, а весы (расстояния) также легко вычисляются раньше. –

+0

@RobertKern Ваш комментарий - ответ! Вы можете опубликовать его как официальный ответ, чтобы люди могли быстрее его найти ... –

ответ

2

Для линейной интерполяции просто используйте numpy.interp(). Если вам нужны сами индексы, используйте numpy.searchsorted(). Единственный сложный бит - это обработка значений сетки, находящихся за пределами вашего диапазона данных. Расстояния легко вычислить, как только у вас есть индексы.

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