векторизованная интерполяция на массиве с nans - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь интерполировать куб изображения NDIM = (dim_frequ, dim_spaxel1, dim_spaxel1) вдоль оси частот. Целью является передискретизация частотного пространства. Массив может содержать nans. Конечно, было бы возможно запустить два цикла for для массива, но это определенно слишком медленно.

Что я хочу в псевдокоде:

import numpy as np
from scipy.interpolate import interp1d
dim_frequ, dim_spaxel1, dim_spaxel2 = 2559, 70, 70
cube       =  np.random.rand(dim_frequ, dim_spaxel1, dim_spaxel2)
cube.ravel()[np.random.choice(cube.size, 1000, replace=False)] = np.nan 

wavelength =  np.arange(1.31, 2.5894999999, 5e-4) # deltaf so that len(wavelength)==DIMfrequ
wavelength_over = np.arange(1.31, 2.5894999999, 5e-5)
cube_over  = interp1d(wavelength, cube, axis=0, kind='quadratic', fill_value="extrapolate")(wavelength_over)
cube_over[np.isnan(cube_over)] # array([], dtype=float64)
  • Я пробовал np.interp, который может обрабатывать только одномерные данные (?)
  • Я пробовал scipy.interpolate.interp1d, который в принципе может обрабатывать массивы вдоль заданной оси, но возвращает nans (я полагаю, из-за нанс в массиве)
    • Это на самом деле работает в случае, когда тип = 'linear'. Я бы на самом деле хотел, чтобы он был немного более изворотливым, но как только я установил тип quadratic, он возвращает nans.
  • Я пробовал scipy.interpolate.CubicSpline который снова поднимает ValueError из-за нанс.

Есть идеи, что еще попробовать? Я совершенно свободен с точки зрения типа интерполяции, но он не должен быть слишком причудливым , то есть ничем не более безумным, чем сплайн или полином низкого порядка

1 Ответ

0 голосов
/ 05 сентября 2018

Итак, пара вещей.

Первый

Это возвращает все nan, потому что в cube_over нет nan после указанного выше

cube_over[np.isnan(cube_over)] 

Поскольку np.isnan(cube_over) все ложно

В противном случае он, кажется, интерполирует все в массиве wavelength_over.

Второй

Сципи не нравится нанс (см. Документы) Типичная практика - отбрасывать нан из нани из набора точек для интерполяции, поскольку обычно это не добавляет никакого значения к функции интерполяции.

Несмотря на то, что он работает с вами, пример interp1d выше. Я предполагаю, что он отбрасывает их вдоль оси при построении функции интерполяции, но я не уверен.

Третий

Какое значение вы на самом деле хотите интерполировать? Я не уверен, какой у вас желаемый результат / конечная точка. Похоже, ваш код работает более или менее, как ожидалось. Когда вы интерполируете ваш массив wavelength_over. Видя, что они очень похожи (если не совпадают со значением массива wavelength. Я думаю, что вы могли бы извлечь выгоду из метода 2d интерполяции, но, опять же, у меня нет хорошего понимания вашей цели.

См. 2d варианты интерполяции в документах Scipy

Надеюсь, это поможет.

...