我正在尝试沿着频率轴插值图像立方体NDIM =(dim_frequ,dim_spaxel1,dim_spaxel1)。目的是对频率空间进行过采样。该数组可能包含nan。当然,可以在数组上运行两个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
,它只能处理1D数据(?)scipy.interpolate.interp1d
,该原则上可以处理
沿给定轴的数组,但返回nans(我认为是因为
数组中的nans)
scipy.interpolate.CubicSpline
再次由于楠而产生了ValueError
。还有其他想法可以尝试吗?就插值的类型而言,我相当自由,但不应太过花哨,即没有什么比样条曲线或低阶多项式更疯狂的了。
答案 0 :(得分:0)
几件事。
第一
这将返回所有nan,因为在上述
之后,cube_over中没有nan。cube_over[np.isnan(cube_over)]
由于np.isnan(cube_over)
全部为假
否则,它似乎是对wavelength_over
数组中的所有内容进行插值。
第二
The roadmap的典型做法是将nan从您的点集中删除以进行插值,因为它通常不会向插值函数添加任何值。
尽管上面的interp1d示例似乎与您一起使用。我猜想它在构建插值功能时会沿轴将它们放下,但是我不确定。
第三
您实际上想插入什么值?我不确定您想要的输出/端点是什么。看来您的代码或多或少按预期工作。在插值wavelength_over
数组时。看起来它们是如此相似(如果与wavelength
数组的值不相同。我认为您可能会受益于2d插值方法,但我对您的目标也不太了解。
请参见scipy doesn't like nans (see the docs)
希望这会有所帮助。