首页 > 解决方案 > 用于在 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')

结果是一个看起来像这样的插值:在此处输入图像描述.

相反,我想找到一种在插值中心区域留下较低值的方法,考虑到右侧数据在其边界之外的信号强度急剧下降这一事实,该边界位于插值区域的边缘。

标签: pythonnumpyscipyinterpolationextrapolation

解决方案


推荐阅读