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