二维阵列中的NaN插值。人口稀少

时间:2013-10-05 20:56:11

标签: python arrays numpy scikit-learn

我有一个带有一些NaN值的2D数组。我想使用我有数据的位置来绘制(插入)这些值。该数组看起来如下所示。

如果可能的话,我想进行插值,这样,当我离开非NaN值时,我越来越接近值0.

我该怎么做?

我读到了gridddata,但似乎是为了处理非结构化的N-dim数据而设计的。我也在other threads中阅读了答案,但我认为他们的出发点不同。

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 个答案:

答案 0 :(得分:3)

根据您希望使用何种插值技术,有许多可能的方法。实际上,由于您的数据被NaN包围,我宁愿将其视为平滑然后插值的函数。如果你想要接近零,那么就你的2d地图上欧几里德距离而言,你与非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]索引执行sumation
  3. 结果你得到类似“密度估计”的东西,通过改变方差(我建议使用= 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 )