使用nans对数组进行矢量化插值

时间:2018-09-05 12:58:01

标签: python arrays numpy scipy interpolation

我正在尝试沿着频率轴插值图像立方体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)
    • 这在类型为“线性”的情况下实际上有效。不过,实际上,我希望它有点像,当我将种类设置为“二次”时,它将返回nans。
  • 我已经尝试过scipy.interpolate.CubicSpline 再次由于楠而产生了ValueError

还有其他想法可以尝试吗?就插值的类型而言,我相当自由,但不应太过花哨,即没有什么比样条曲线或低阶多项式更疯狂的了。

1 个答案:

答案 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)

希望这会有所帮助。