2D数组外推的线性/双线性插值替代方案

2024-10-04 01:23:33 发布

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

我正在寻找一种方法来插值2d数组的一部分,很可能是用幂律的方法,不过也许知识更丰富的用户有其他更适合数据的建议。事实上,我甚至不知道如何实现幂律方法,但我(糟糕的)直觉是它可能会起作用。在

我有一个数组,它有一个屏蔽数据的大致圆形区域,类似于所提供的示例。我想用周围的数据对这个区域进行插值,得到一个空白区域的估计值。然而,复杂的是,在一个边缘(这里是右侧)有一个附加的组成部分,我知道它有相当尖锐的边界,很可能符合幂律。到目前为止,我已经尝试过线性和双三次插值方法,但是这些方法失败了,因为它们高估了右侧过量区域的贡献。在

 annulus= np.array([[0.0,   0.0,    0.0,    0.0,    0.0,    0.0,    16.0,   16.0,   17.0,   18.0,   0.0,    0.0,    0.0,    0.0,    0.0],
[0.0,   0.0,    0.0,    15.0,   15.0,   16.0,   16.0,   17.0,   18.0,   19.0,   19.0,   0.0,    0.0,    0.0,    0.0],
[0.0,   0.0,    15.0,   15.0,   15.0,   16.0,   17.0,   17.0,   18.0,   19.0,   20.0,   21.0,   0.0,    0.0,    0.0],
[0.0,   0.0,    15.0,   15.0,   16.0,   16.0,   0.0,    0.0,    0.0,    20.0,   21.0,   22.0,   23.0,   0.0,    0.0],
[14.0,  14.0,   15.0,   15.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    22.0,   23.0,   25.0,   26.0,   0.0],
[14.0,  14.0,   15.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    24.0,   26.0,   28.0,   30.0],
[13.0,  14.0,   14.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    26.0,   28.0,   30.0,   33.0],
[13.0,  14.0,   14.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    25.0,   28.0,   30.0,   33.0,   0.0],
[13.0,  13.0,   14.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    24.0,   27.0,   30.0,   33.0,   0.0,    0.0],
[13.0,  13.0,   14.0,   0.0,    0.0,    0.0,    0.0,    0.0,    0.0,    26.0,   28.0,   32.0,   35.0,   0.0,    0.0],
[12.0,  13.0,   14.0,   15.0,   0.0,    0.0,    0.0,    0.0,    24.0,   27.0,   30.0,   34.0,   0.0,    0.0,    0.0],
[0.0,   13.0,   14.0,   15.0,   16.0,   0.0,    0.0,    22.0,   24.0,   27.0,   31.0,   0.0,    0.0,    0.0,    0.0],
[0.0,   0.0,    0.0,    15.0,   16.0,   18.0,   19.0,   22.0,   25.0,   28.0,   32.0,   0.0,    0.0,    0.0,    0.0],
[0.0,   0.0,    0.0,    14.0,   16.0,   18.0,   20.0,   22.0,   25.0,   29.0,   33.0,   0.0,    0.0,    0.0,    0.0],
[0.0,   0.0,    0.0,    14.0,   16.0,   18.0,   20.0,   22.0,   26.0,   29.0,   34.0,   0.0,    0.0,    0.0,    0.0]])




 #change 0 to nan
 annulus[annulus==0]='nan'

 x=np.arange(0,annulus.shape[1])
 y=np.arange(0,annulus.shape[0])

 #mask
 annulus=np.ma.masked_invalid(annulus)
 xx,yy=np.meshgrid(x,y)

 x1=xx[~annulus.mask]
 y1=yy[~annulus.mask]
 newarr=annulus[~annulus.mask]

 #for method below, "linear" instead of "cubic" applies linear interpolation.
 result=interpolate.griddata((x1,y1),newarr.ravel(),
                             (xx,yy),
                                 method='cubic')

结果是一个插值,它看起来像:enter image description here。在

相反,我希望找到一种在插值中心区域保留较低值的方法,考虑到右侧数据在插值区域边缘的边界以外的信号强度急剧下降。在


Tags: 数据方法区域npmask数组nan边缘