- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个大数组 y
定义在一个非均匀、有序的网格 x
上。数组的长度通常为 N~2^14 到 N~2^18。我想获得数组的样条插值(或二次)。我面临的问题是,即使对于较低的 N 值,插值也需要很长时间。
import numpy as np
from scipy.interpolate import interp1d
N = 2 ** 12 # = 4096
x = np.linspace(0, 2*np.pi, N)
y = np.sin(x)
%time f = interp1d(x, y, 'cubic', )
CPU times: user 8min 5s, sys: 1.39 s, total: 8min 7s
Wall time: 8min 7s
我看到的一个选项是我只需要在一组非常有限的数据点上进行插值。有没有办法只在需要时计算插值?
您能否建议一个替代方案,该替代方案还可以在低于 x.min()
和高于 x.max()
的值下进行外推?
谢谢!
最佳答案
对于非均匀分布的横坐标,您可能需要考虑广义插值技术(例如 B 样条)。
将您的数据近似为多个系数乘以基函数的总和(例如,具有非均匀选择的节点的 B 样条曲线 - 或放置良好的高斯分布的径向基函数网络)。这些功能必须跨越感兴趣的空间。
现在您可以使用最小二乘法来近似加权系数 - 然后以您需要的任何分辨率在任何地方重新采样。如果您采用这种方法,您可以根据平滑度对系统进行正则化,以便在 x.min() 和 x.max() 之外提供更合理的值。
这是搭配方法:假设您的样本值在向量 x,y 中。将你的基础向量设置为 phi_k(x) 的采样版本
然后设置基础 B = c_[phi_1,phi_2,...,phi_M] 并使用最小二乘法:c,res,rnk,sv = lstsq(B,y)。
如果基础多项式的数量很少 - 那么这可以进行得很快。
现在您的向量 c 包含系数。您可以通过构建在那里采样的新基向量来计算感兴趣点的新值:Bnew = c_[phi_1_new,phi_2_new,...,phi_M_new]
并投影 y_new = dot(Bnew,c)
关于python - 大型数组的插值和外插,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23909266/
我是一名优秀的程序员,十分优秀!