我想在不同的模型之间进行插值 . 为方便起见,我的数据如下所示:
我有10种不同的模拟(我称之为 z
) . 对于每个 z
,我有一个 array x
和一个 array y
(对于给定的 z
, len(x)=len(y)
) . 例如:
for z=1
: x.shape=(1200,)
和 y.shape=(1200,)
for z=2
: x.shape=(1250,)
和 y.shape=(1250,)
for z=3
: x.shape=(1236,)
和 y.shape=(1236,)
等等 ...
我想插值,以便对于给定的 z
和 x
,我得到 y
. 例如,对于 z=2.5
和 x=10**9
,代码输出 y
. 我假设:
y = a*x + b*z + c
当然我不知道 a
, b
和 c
.
我的问题是如何将数据存储在网格中?我很困惑,因为 x
的大小与 x
和 y
不同 . 如何构建网格?
更新
我能够部分解决我的问题 . 我首先做的是使用 interp1d
在 x
和 y
之间进行插值 . 它工作得非常好 . 然后我创建了一个 x
和 y
值的新网格 . 简而言之,该方法是:
f = interp1d(x, y, kind='linear')
new_x = np.linspace(10**7, 4*10**9, 10000)
new_y = f(new_x)
然后我插入 x
, y
和 z
:
ff = LinearNDInterpolator( (x, z), y)
要测试方法是否有效,这是一个带有 z=3
的图 .
情节看起来很好,直到 x=10**8
. 实际上,该线偏离了原始模型 . 这是我进一步放大时的情节:
x > 10**8
时插值明显不好 . 我该如何解决?
2 回答
似乎在您的问题中曲线y(x)表现良好,因此您可能只是先为z的给定值插入y(x),然后在获得的y值之间进行插值 .
你正在做什么对我来说似乎有点奇怪,至少你似乎使用一组
y
值来进行插值 . 我建议不要一个接一个地执行两个插值,但考虑到你的y(z,x)
函数是纯二维插值问题的结果 .正如我在评论中指出的那样,我建议使用
scipy.interpolate.LinearNDInterpolator
,这是griddata
在引擎盖下用于双线性插值的同一个对象 . 正如我们在评论中所讨论的那样,你需要有一个插值器,你可以在之后多次查询,所以我们必须使用低级插值器对象,因为它是可调用的 .以下是我的意思的完整示例,包括虚拟数据和绘图:
您没有指定如何存储
(x,y)
数组对的系列,我使用了numpyndarray
的列表 . 如您所见,我将1d数组列表压缩为一组1d数组:all_x
,all_y
,all_z
. 这些可以用作分散的数据,您可以从中构造插值器对象 . 正如您在结果中看到的那样,对于z=2
它会再现输入点,对于非整数z
,它会在相关的y(x)
曲线之间进行插值 .此方法应适用于您的数据集 . 但需要注意的是:
x
轴上的对数刻度上有大量数字 . 仅这一点就可能导致数字不稳定 . 我建议您也尝试使用log(x)
执行插值,它可能表现得更好(这只是一个模糊的猜测) .