Я хочу интерполировать значения в массиве 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)
Однако мне не нравится такой подход, что много. ..
Для линейной интерполяции просто используйте 'numpy.interp()'. Если вам нужны сами индексы, используйте 'numpy.searchsorted()'. Единственный сложный бит - это обработка значений сетки, находящихся за пределами вашего диапазона данных. Расстояния легко вычислить, как только у вас есть индексы. –
Спасибо за ваш ответ, «numpy.searchsorted» - хороший подход для поиска индексов в массивах 1D, а весы (расстояния) также легко вычисляются раньше. –
@RobertKern Ваш комментарий - ответ! Вы можете опубликовать его как официальный ответ, чтобы люди могли быстрее его найти ... –