我有一个2D规则的参数网格,每个点都有一个1D模型的模型,我想将该1D模型数组插入任何参数空间点(不仅仅是网格节点)。
对于具有网格值A
的1个参数(例如a
)的1D网格,我可以使用interpolate.RectBivariateSpline来完成这个技巧,它会生成一个我可以在任何给定值下调用的函数A
。
例如:
from scipy import interpolate
ip = interpolate.RectBivariateSpline(a, x, model, s = 0)
new_model = ip([aa], [x])
其中a
是1D“网格”或参数A的值数组,x
是离散像素的1D数组,模型在该数组中表示f(x) = model(x)
,{ {1}}是我要插入的A的新值。
对于2D情况,一种解决方案是使用 RectBivariateSpline 或其他方法在x(每个x_i)的每个像素处计算2个参数的插值(如在2D平面中切片3D体积) )但这似乎很麻烦,并没有考虑模型上像素之间的相关性。
这里的解决方案Multivariate spline interpolation in python/scipy?并不适用于我的情况,因为我需要返回一个完整的数组,我需要在不同的时刻在不同的点进行评估。
来自scipy interpolation上的解决方案:LinearNDinterp
和NearestNDInterp可能会有效,但我不知道如何做与 RectBivariateSpline 类似的事情,即将它提供给2D(或nD)参数网格,模型的像素数组和模型值,然后获取相同像素但不同参数值的插值模型aa
解决方案可能在这里:Interpolation in vector-valued multi-variate function但我不知道如何将其重新解释为我的情况......
最终,我想要做的是使用函数grid(a1, a2, ... an; x) -> model(A1', A2', ... An'; x)
(或等效的东西),并且在将模型与数据进行比较时,使用一些Montecarlo在更精细的网格中探索参数空间。
提前致谢!
答案 0 :(得分:0)
好吧,因为没有人得到任何帮助我会发布我自己的解决方案。 正如Interpolation in vector-valued multi-variate function上的解决方案所示,并且对Extrapolate with LinearNDInterpolator的 LinearNDinterpolation 进行了更多的研究,基本上是Python 4D linear interpolation on a rectangular grid(我在第一次搜索时错过了这个)以一种非常直接的方式使它适应我的情况。
points = np.array((a1, a2)).T
values = np.array((models))
ip = interpolate.LinearNDInterpolator(points, values)
p = [A1_new, A2_new]
new_model = ip([point])[0]
其中a1,a2是具有每个参数的网格点的数组,例如在2x3网格中:
a1= [1.1, 1.1, 1.1, 2.2, 2.2, 2.2]
a2= [3.3, 4.4, 5.5, 3.3, 4.4, 5.5]
和一个情节作为示例(我的模型):
有了这个,我可以在我需要的网格的任何一点调用“function”ip,这也可以很容易地扩展到更高的维度new_model = ip(A1', A2', ...)
。
虽然我没有检查它的可扩展性随时间的变化(如果它与N呈线性关系,或者最可能与N的幂相关。)
我希望这对其他人有所帮助。