3

我有一个带有一些 NaN 值的二维数组。我想使用我拥有数据的位置来修复(插值)这些值。该数组如下所示。

如果可能的话,我想做插值,这样当我远离非 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]])
4

1 回答 1

3

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

  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 并对高斯值求和。

它会是这样的:

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 )
于 2013-10-06T14:05:47.727 回答