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