编程语言
首页 > 编程语言> > python-2D数组中的NaN插值.人口稀少

python-2D数组中的NaN插值.人口稀少

作者:互联网

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

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

我怎样才能做到这一点?

我读到大约gridddata,但它似乎旨在用于非结构化N维数据.我也阅读了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]])

解决方法:

基于您想使用哪种插值技术,有数十种可能的方法.实际上,由于您的数据被NaN包围,因此我宁愿将其视为先平滑后插值的函数.如果您想更接近零,那么就二维地图上的欧几里德距离而言,您与非NaN的距离就越远,我建议您执行以下操作:

>将每个非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).
>对于每个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 )

标签:scikit-learn,arrays,python,numpy
来源: https://codeday.me/bug/20191122/2061615.html