2D数组中的NaN插值。稀疏填充。

3
我有一个二维数组,其中一些值为NaN。我想使用有数据的位置对这些值进行插值(内插)。该数组如下所示。
如果可能的话,我希望进行插值,以便在远离非NaN值时,我越来越接近值0。
我应该怎么做呢?
我了解到gridddata,但它似乎是设计用于处理非结构化的N维数据。我还阅读了其他线程中的答案,但我认为他们的起点不同。
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]])
1个回答

3
根据您想使用的插值技术,可能有数十种可能的方法。实际上,由于您的数据被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 )

1
如果您选择这条路线,您应该知道Scipy有一个径向基函数类 - 请参见此处,以及此示例 - ali_m
有没有现成的函数或标准的短代码可以使用普通克里金插值方法呢?谢谢。 - Spider
@ali_m: 在那个例子中,x、y、z 需要有相同的大小。在这种情况下,x、y 是 1 维数组,而 z 是 2 维数组! - hoang tran
@hoangtran 好的,在这种情况下,您只需使用 z 值的二维数组中的非 NaN 元素作为您的一维向量 z,而 xy 则是它们对应的列/行位置。 - ali_m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接