SciPy UnivariateSpline指定轴?

时间:2014-01-02 16:25:55

标签: numpy scipy interpolation spline

使用scipy.interpolate.interp1d可以传入(1080,4)nd.array并在单个命令中为每个'row'计算插值函数:

spline = interp1d(np.arange(1,5), np.random.random(1080,4), kind='cubic')

与现有的Fortran代码相比,我得到的插值结果略有不同(关节)。我相信这是因为SciPy源使用的是b样条,而Fortran代码使用的是来自数字配方的样条。

我正在尝试使用带有s=0的UnivariateSpline执行相同的插值,因此InterpolatedUnivariateSpline。

如果我逐行传递数据,即使用迭代器遍历所有1080行,我能够正常工作 - 这是非常低效的。

使用:

spline = UnivariateSpline(np.arange(1,5).reshape(-1,1), np.random.random(1080,4), s=0, k=3)

我看到了:

failed in converting 2nd argument `y' of dfitpack.fpcurf0 to C/Fortran array

我认为这是将多维数组放入Fitpack的问题?有关如何避免迭代器的任何见解?此外,任何与数字配方(section 3.3, p.120)中描述的匹配的SciPy插值函数的见解 - 您必须键入页码,我不能直接链接,它是Flash查看器...

1 个答案:

答案 0 :(得分:0)

在较早版本的SciPy中(我在0.14中观察到),interp1d返回的样条质量相对较差。在0.19及更高版本中,interp1d与其他样条例程一致,并且由于它接受向量输入,我认为这回答了问题。下面是三个样条构造函数的比较:后两个只占一行作为输入。

from scipy.interpolate import interp1d, UnivariateSpline, splrep, splev
x = np.arange(1, 5)
y = np.random.normal(size=(1080, 4))
spl1 = interp1d(x, y, kind='cubic')
spl2 = UnivariateSpline(x, y[123, :], s=0, k=3)
spl3 = splrep(x, y[123, :], s=0, k=3)

t = 2.345
print(spl1(t)[123], spl2(t), splev(t, spl3))

打印(使用我的随机数字)

-0.333973049011 -0.333973049011 -0.333973049011