>我有一个带有一些 NaN 值的 2D 数组。我想使用我有数据的位置对这些值进行上色(插值(。该数组如下所示。
如果可能的话,我想进行插值,以便当我远离非 NaN 值时,我越来越接近值 0。
我该怎么做?
我读过关于gridddata的文章,但它似乎被设计为处理非结构化的N-dim数据。我也阅读了其他线程中的答案,但我认为它们的出发点不同。
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 包围,我宁愿将其视为一个函数平滑然后插值。如果你想接近零,你离 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 )
。 - 对于每个 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 )