【问题标题】:NaN interpolation in 2D array. Sparsely populated二维数组中的 NaN 插值。人口稀少
【发布时间】:2013-10-12 17:12:23
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays numpy scikit-learn


    【解决方案1】:

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

    【讨论】:

    • 如果你选择走这条路,你应该知道 Scipy 有一个径向基函数类 - 请参阅 herethis example here
    • 普通克里金插值法有现成的函数或标准短代码吗?谢谢
    • @ali_m:在该示例中,x、y、z 需要具有相同的大小。在这种情况下 x, y 是一维数组,而 z 是二维数组!
    • @hoangtran 好吧,在这种情况下,您只需使用二维 z 值数组中的非 nan 元素作为一维向量 zxy 将是它们的对应的列/行位置。
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2015-03-13
    • 2015-12-02
    • 2019-04-24
    • 2015-06-08
    相关资源
    最近更新 更多