gpt4 book ai didi

python - 大型数组的插值和外插

转载 作者:太空狗 更新时间:2023-10-30 02:20:20 25 4
gpt4 key购买 nike

我有一个大数组 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)

  • 此方法可让您轻松地控制使用您选择的任何类型的正则化来增强
  • 并在任意点对系统重新采样
  • 使用任何对您的问题有意义的基函数
  • 如果M足够小则系统可以快速求解

关于python - 大型数组的插值和外插,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23909266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com