Я ищу способ интерполировать часть двумерного массива, вероятно, с использованием степенного подхода, хотя, возможно, у более знающих пользователей есть другие предложения, более подходящие для данных.По правде говоря, я не могу понять, как реализовать подход степенного закона, но моя (плохая) интуиция заключается в том, что он может сработать.
У меня есть массив, который имеет приблизительно круглую областьзамаскированные данные, аналогичные предоставленному примеру.Я хотел бы интерполировать по этой области, используя окружающие данные, чтобы получить оценку для пустой области.Сложность, однако, заключается в том, что на одном краю (здесь справа) есть дополнительный компонент к окружающим данным, который, как я знаю, имеет довольно резкие границы, вероятно, соответствующие степенному закону.До сих пор я пробовал как линейные, так и бикубические методы интерполяции, однако эти подходы терпят неудачу, потому что они переоценивают вклад от области избытка справа.
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')
Результатом является интерполяция, которая выглядит следующим образом: .
Вместо этого я хотел бы найти подход, который оставляет более низкие значения в интерполированной центральной области, принимая во внимание тот факт, что данные справа имеют резкое уменьшение силы сигнала за границей, которая лежит на краюинтерполированной зоны.