Scipy样条插值:在实际计算前确定tck中knots/B样条系数向量的数组长度

Scipy spline interpolation: Determine array length of vector of knots / B-spline coefficients in tck before actual computation

是否有可能在计算值之前确定 scipy.interpolate.splprep 返回的 tck 元组中数组的数组长度?

我必须将样条插值拟合到具有 500 万个数据点(或更少,可以变化)的噪声数据。 我的观察是,数组长度为 ~ 90 的插值非常好,而计算更高数组长度的插值需要很长时间(它有时也会直接从 ~ 90 跳到 ~ 1000,同时使 s 小了一步,插值也变得嘈杂)并且它不够合适,如果数组长度远小于 (<50)...

其实这个数组长度取决于提供给splprep函数的平滑因子s,但是对于不同的测量数据,s 变化很大以获得大约 90 的一致数组长度。例如对于 data1 s 具有大约 1000 的值以获得 len(cfk[0]) 等于 90,对于 data2 s 的值大约为 100,在 data1data2 的相同长度下,len(cfk[0]) 等于 90。这可能取决于数据的噪声...

我考虑过一个循环,其中 s 在某个点开始并在循环中递减,同时不断检查 len(cfk[0]) - 但这需要很长时间,尤其是如果len(cfk[0]) 接近 90。

因此,在计算 cfk 元组之前以某种方式知道平滑因子以获得所需的数组长度会很有用。

简短回答:不,不容易。 splrep 包装的 Dierckx Fortran 库使用一些相当 non-trivial 的逻辑来确定结向量,并且它全部融入 Fortran 代码中。所以,唯一的办法就是仔细追踪后者。它可以从 netlib 获得,也可以 scipy/interpolate/fitpack