Альтернативы линейной / билинейной интерполяции для экстраполяции на двумерном массиве - PullRequest
0 голосов
/ 18 сентября 2018

Я ищу способ интерполировать часть двумерного массива, вероятно, с использованием степенного подхода, хотя, возможно, у более знающих пользователей есть другие предложения, более подходящие для данных.По правде говоря, я не могу понять, как реализовать подход степенного закона, но моя (плохая) интуиция заключается в том, что он может сработать.

У меня есть массив, который имеет приблизительно круглую областьзамаскированные данные, аналогичные предоставленному примеру.Я хотел бы интерполировать по этой области, используя окружающие данные, чтобы получить оценку для пустой области.Сложность, однако, заключается в том, что на одном краю (здесь справа) есть дополнительный компонент к окружающим данным, который, как я знаю, имеет довольно резкие границы, вероятно, соответствующие степенному закону.До сих пор я пробовал как линейные, так и бикубические методы интерполяции, однако эти подходы терпят неудачу, потому что они переоценивают вклад от области избытка справа.

 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.

Вместо этого я хотел бы найти подход, который оставляет более низкие значения в интерполированной центральной области, принимая во внимание тот факт, что данные справа имеют резкое уменьшение силы сигнала за границей, которая лежит на краюинтерполированной зоны.

...