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

2024-10-01 00:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2D数组和一些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]])

Tags: 数据答案数组nanarray插值结构化other
1条回答
网友
1楼 · 发布于 2024-10-01 00:14:57

有几十种可能的方法,基于什么样的插值技术,你想使用。事实上,由于你的数据被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,您将遍历所有非nan并求出gaussian值的总和。在

会是这样的:

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 )

相关问题 更多 >