Я пытаюсь интерполировать куб изображения 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
из-за нанс.
Есть идеи, что еще попробовать? Я совершенно свободен с точки зрения типа интерполяции, но он не должен быть слишком причудливым , то есть ничем не более безумным, чем сплайн или полином низкого порядка