二维阵列中的 NaN 插值.稀少



>我有一个带有一些 NaN 值的 2D 数组。我想使用我有数据的位置对这些值进行上色(插值(。该数组如下所示。

如果可能的话,我想进行插值,以便当我远离非 NaN 值时,我越来越接近值 0。

我该怎么做?

我读过关于gridddata的文章,但它似乎被设计为处理非结构化的N-dim数据。我也阅读了其他线程中的答案,但我认为它们的出发点不同。

array([[        nan,         nan,         nan,         nan,         nan,
                nan,         nan,         nan,         nan,         nan],
       [        nan,         nan,         nan,         nan,         nan,
                nan,         nan,         nan,         nan,         nan],
       [        nan,         nan,         nan,         nan,         nan,
                nan,         nan,         nan,         nan,         nan],
       [        nan,         nan,         nan,         nan,         nan,
                nan,         nan,         nan,         nan,         nan],
       [ 1.        ,  0.        ,  1.        ,  0.        ,  0.25      ,
                nan,  0.        ,         nan,         nan,         nan],
       [        nan,  0.        ,         nan,  0.25      ,  0.66666667,
         0.25      ,  0.66666667,  0.        ,  1.        ,         nan],
       [ 0.        ,  0.5       ,  0.66666667,  0.8       ,  0.66666667,
         0.8       ,  0.5       ,  0.83333333,         nan,         nan],
       [ 0.625     ,  0.5625    ,  0.9       ,  0.8       ,  0.8       ,
         0.83333333,  0.57142857,  0.66666667,  0.5       ,         nan],
       [        nan,  1.        ,  0.71428571,  0.85714286,  1.        ,
         1.        ,  1.        ,         nan,         nan,         nan],
       [        nan,         nan,         nan,         nan,  1.        ,
         1.        ,         nan,         nan,         nan,         nan]])

根据您想要使用的插值技术类型,有数十种可能的方法。事实上,由于您的数据被 NaN 包围,我宁愿将其视为一个函数平滑然后插值。如果你想接近零,你离 2D 地图上的欧几里得距离就越远,我建议如下:

  1. 将每个非 NaN 数据点X[i,j]视为以 [i,j] 为中心的高斯,方差=1,缩放使其pdf( [i,j] ) = X[i,j],因此f_ij( [a,b] ) = X[i,j] * exp( -|| [a,b] - [i,j] ||^2/2 )
  2. 对于每个 NaN 数据点,X[a,b]设置X[a,b] = sum( f_ij( [a,b] ) )其中对非 NaN 数据点的所有[i,j]指数执行求和

结果,你会得到类似"密度估计"的东西,通过改变方差(我建议使用 =1(,你可以修改值的"消失速度"。

因此,代码将只是对所有 NaN 进行一次循环,对于每个 NaN,您遍历所有非 NaN 并将高斯值求和。

它会是这样的:

nans    = np.array( np.where(  np.isnan(X) ) ).T
notnans = np.array( np.where( ~np.isnan(X) ) ).T
for p in nans:
    X[p[0],p[1]] = sum( X[q[0],q[1]]*np.exp(-(sum((p-q)**2))/2) for q in notnans )

相关内容

  • 没有找到相关文章

最新更新