线性/双线性插值的替代方法,可在2D数组上进行插值

时间:2018-09-18 02:33:42

标签: python numpy scipy interpolation extrapolation

我正在寻找一种插补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

我反而想找到一种方法,考虑到以下事实:右侧数据的信号强度超出了位于插值边缘的边界,信号强度急剧下降,这使得插值中心区域的值较低区。

0 个答案:

没有答案