文章目录
- scipy-interpolate整理
- Univariate interpolation 单变量插值
- Multivariate interpolation 多元插值
- Unstructured data 非结构化数据::
- For data on a grid 对于网格上的数据::
- Tensor product polynomials 张量积多项式::
- 1-D Splines 一维样条
- Functional interface to FITPACK routines FITPACK 例程的功能接口::
- Object-oriented FITPACK interface 面向对象的FITPACK接口::
- 2-D Splines 二维样条曲线
- For data on a grid 对于网格上的数据::
- For unstructured data 对于非结构化数据::
- Low-level interface to FITPACK functions FITPACK 函数的低级接口::
- Additional tools 附加工具
- scipy.interpolate.interp1d 插值一维函数。
- 注意
- 示例
- scipy.interpolate.UnivariateSpline 一维平滑样条拟合给定的一组数据点
- 注意
- References 参考
- 示例
- 方法
scipy-interpolate整理
官方文档地址:https://docs.scipy.org/doc/scipy/reference/interpolate.html
插值中使用的对象的子包。
如下所列,该子包包含样条函数和类、一维和多维(单变量和多元)插值类、拉格朗日和泰勒多项式插值器以及 FITPACK 和 DFITPACK 函数的包装器。
Univariate interpolation 单变量插值
函数名称 | 说明 |
---|---|
interp1d (x, y[, kind, axis, copy, …]) | 插值一维函数。 |
BarycentricInterpolator (xi[, yi, axis]) | 一组点的插值多项式 |
KroghInterpolator (xi, yi[, axis]) | 一组点的插值多项式。 |
barycentric_interpolate (xi, yi, x[, axis]) | 多项式插值的便捷函数。 |
krogh_interpolate (xi, yi, x[, der, axis]) | 多项式插值的便捷函数。 |
pchip_interpolate (xi, yi, x[, der, axis]) | pchip 插值的便捷功能。 |
CubicHermiteSpline (x, y, dydx[, axis, …]) | 分段三次插值器匹配值和一阶导数。 |
PchipInterpolator (x, y[, axis, extrapolate]) | PCHIP 一维单调三次插值。 |
Akima1DInterpolator (x, y[, axis]) | Akima插值器 |
CubicSpline (x, y[, axis, bc_type, extrapolate]) | 三次样条数据插值器。 |
PPoly (c, x[, extrapolate, axis]) | 用系数和断点表示的分段多项式 |
BPoly (c, x[, extrapolate, axis]) | 用系数和断点表示的分段多项式。 |
Multivariate interpolation 多元插值
Unstructured data 非结构化数据::
名称 | 说明 |
---|---|
griddata (points, values, xi[, method, …]) | 插入非结构化 D-D 数据。 |
LinearNDInterpolator (points, values[, …]) | N > 1 维的分段线性插值。 |
NearestNDInterpolator (x, y[, rescale, …]) | 最近的ND插值器(x,y)。 |
CloughTocher2DInterpolator (points, values[, …]) | CloughTocher2DInterpolator(点,值,tol=1e-6)。 |
RBFInterpolator (y, d[, neighbors, …]) | N 维径向基函数 (RBF) 插值。 |
Rbf (*args, **kwargs) | 用于从 N 维分散数据到 M 维域的函数的径向基函数插值的类。 |
For data on a grid 对于网格上的数据::
名称 | 说明 |
---|---|
interpn (points, values, xi[, method, …]) | 规则或直线网格上的多维插值。 |
RegularGridInterpolator (points, values[, …]) | 在任意维度的规则或直线网格上进行插值。 |
RectBivariateSpline (x, y, z[, bbox, kx, ky, s]) | 矩形网格上的双变量样条近似。 |
Tensor product polynomials 张量积多项式::
NdPPoly
(c, x[, extrapolate])分段张量积多项式
1-D Splines 一维样条
名称 | 说明 |
---|---|
BSpline (t, c, k[, extrapolate, axis]) | B 样条基础上的单变量样条。 |
make_interp_spline (x, y[, k, t, bc_type, …]) | 计算插值 B 样条(的系数)。 |
make_lsq_spline (x, y, t[, k, w, axis, …]) | 计算基于 LSQ(最小二乘)的拟合 B 样条(的系数)。 |
make_smoothing_spline (x, y[, w, lam]) | 使用 lam 计算平滑三次样条函数(的系数),以控制曲线的平滑度与其与数据的接近度之间的权衡。 |
Functional interface to FITPACK routines FITPACK 例程的功能接口::
名称 | 说明 |
---|---|
splrep (x, y[, w, xb, xe, k, task, s, t, …]) | 求一维曲线的 B 样条表示。 |
splprep (x[, w, u, ub, ue, k, task, s, t, …]) | 求 N 维曲线的 B 样条表示。 |
splev (x, tck[, der, ext]) | 评估 B 样条或其导数。 |
splint (a, b, tck[, full_output]) | 计算两个给定点之间 B 样条的定积分。 |
sproot (tck[, mest]) | 求三次 B 样条的根。 |
spalde (x, tck) | 计算 B 样条的所有导数。 |
splder (tck[, n]) | 计算给定样条曲线的导数的样条曲线表示 |
splantider (tck[, n]) | 计算给定样条线的反导数(积分)的样条线。 |
insert (x, tck[, m, per]) | 将结插入 B 样条曲线。 |
Object-oriented FITPACK interface 面向对象的FITPACK接口::
名称 | 说明 |
---|---|
UnivariateSpline (x, y[, w, bbox, k, s, ext, …]) | 一维平滑样条拟合给定的一组数据点。 |
InterpolatedUnivariateSpline (x, y[, w, …]) | 给定数据点集的一维插值样条。 |
LSQUnivariateSpline (x, y, t[, w, bbox, k, …]) | 具有显式内部结的一维样条线。 |
2-D Splines 二维样条曲线
For data on a grid 对于网格上的数据::
名称 | 说明 |
---|---|
RectBivariateSpline (x, y, z[, bbox, kx, ky, s]) | 矩形网格上的双变量样条近似。 |
RectSphereBivariateSpline (u, v, r[, s, …]) | 球体上矩形网格的双变量样条近似。 |
For unstructured data 对于非结构化数据::
名称 | 说明 |
---|---|
BivariateSpline () | 二元样条的基类。 |
SmoothBivariateSpline (x, y, z[, w, bbox, …]) | 平滑二元样条近似。 |
SmoothSphereBivariateSpline (theta, phi, r[, …]) | 球坐标中的平滑二元样条近似。 |
LSQBivariateSpline (x, y, z, tx, ty[, w, …]) | 加权最小二乘二元样条近似。 |
LSQSphereBivariateSpline (theta, phi, r, tt, tp) | 球坐标中的加权最小二乘二元样条近似。 |
Low-level interface to FITPACK functions FITPACK 函数的低级接口::
名称 | 说明 |
---|---|
bisplrep (x, y, z[, w, xb, xe, yb, ye, kx, …]) | 求曲面的二元 B 样条表示。 |
bisplev (x, y, tck[, dx, dy]) | 评估二元 B 样条及其导数。 |
Additional tools 附加工具
名称 | 说明 |
---|---|
lagrange (x, w) | 拉格朗日(x, w) |
approximate_taylor_polynomial (f, x, degree, …) | 通过多项式拟合估计 f 在 x 处的泰勒多项式。 |
pade (an, m[, n]) | 将多项式的 Pade 近似值返回为两个多项式的比率。 |
pchip 是 PchipInterpolator 的别名,用于向后兼容(不应在新代码中使用)。
scipy.interpolate.interp1d 插值一维函数。
此类被视为遗留类,将不再接收更新。 这也可能意味着它将在未来的 SciPy 版本中被删除。
原文地址:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
class scipy.interpolate.interp1d(x, y, kind=‘linear’, axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)
x 和 y 是用于近似某个函数 f 的值数组:y = f(x)。 此类返回一个函数,其调用方法使用插值来查找新点的值。
参数:
-
x(npoints, )
实数值的一维数组。
-
y(…, npoints, …)
实数值的 N 维数组。 y 沿插补轴的长度必须等于 x 的长度。 使用轴参数选择正确的轴。 与其他插补器不同,默认插补轴是 y 的最后一个轴。
-
kind (str or int, optional)
将插值类型指定为字符串或整数,指定要使用的样条插值器的顺序。 该字符串必须是 ‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, or ‘next’. ‘zero’, ‘slinear’, ‘quadratic’ and ‘cubic’ 是指零阶、一阶、二阶或三阶样条插值;; ‘previous’ and ‘next’ 只是返回该点的上一个或下一个值; 插值半整数(例如 0.5、1.5)时, ‘nearest-up’ and ‘nearest’ 不同, ‘nearest-up’ 向上舍入, ‘nearest’ 向下舍入. 默认为“线性”。
-
axis (int, optional)
y 数组中的轴对应于 x 坐标值。 与其他插值器不同,默认为 axis=-1。
-
copy (bool, optional)
如果为 True,则该类会生成 x 和 y 的内部副本。 如果为 False,则使用对 x 和 y 的引用。 默认是复制。
-
bounds_error (bool, optional)
如果为 True,则每当尝试对 x 范围之外的值进行插值(需要外推时)都会引发 ValueError。 如果为 False,则将超出范围的值分配给 fill_value。 默认情况下,除非 fill_value=“extrapolate”,否则会引发错误。
-
fill_value (array-like or (array-like, array_like) or “extrapolate”, optional)
- 如果是 ndarray (或 float),则该值将用于填充数据范围之外的请求点。 如果未提供,则默认值为 NaN。 类似数组必须正确广播到非插值轴的维度。
- 如果是双元素元组,则第一个元素用作 x_new < x[0] 的填充值,第二个元素用作 x_new > x[-1] 的填充值。 任何不是 2 元素元组的东西(例如,list 或 ndarray,无论形状如何)都被视为单个类似数组的参数,用于两个边界,如下所示,
below, above = fill_value, fill_value
.。 使用二元素元组或ndarray需要bounds_error=False。 - 如果“外推”,则将外推数据范围之外的点。
-
assume_sorted (bool, optional)
如果为 False,则 x 的值可以按任何顺序排列,并且首先对它们进行排序。 如果为 True,则 x 必须是单调递增值的数组。
注意
使用输入值中存在 NaN 调用 interp1d 会导致未定义的行为。
输入值 x 和 y 必须可转换为浮点值,例如 int 或 float。
如果 x 中的值不唯一,则生成的行为是未定义的并且特定于类型的选择,即更改类型将更改重复项的行为。
示例
import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate
x = np.arange(0, 50)
y = np.exp(-x/5.0)
f = interpolate.interp1d(x, y)
xnew = np.arange(0, 50, 1)
ynew = f(xnew) # use interpolation function returned by `interp1d`
plt.plot(x, y, 'o', xnew, ynew, '-')
plt.show()
scipy.interpolate.UnivariateSpline 一维平滑样条拟合给定的一组数据点
class scipy.interpolate.UnivariateSpline(x, y, w=None, bbox=[None, None], k=3, s=None, ext=0, check_finite=False)
将 k 次样条 y = spl(x) 拟合到提供的 x、y 数据。 s 通过指定平滑条件来指定结数。
参数:
-
x(N,) array_like
独立输入数据的一维数组。 一定会增加; 如果 s 为 0,则必须严格递增。
-
y(N,) array_like
相关输入数据的一维数组,长度与 x 相同。
-
w(N,) array_like, optional
样条拟合的权重。 必须是积极的。 如果w为None,则权重均为1。默认为None。
-
bbox(2,) array_like, optional
指定近似区间边界的 2 序列。 如果 bbox 为 None,则 bbox=[x[0], x[-1]]。 默认为“无”。
-
k (int, optional)
平滑样条的程度。 必须为 1 <= k <= 5。k = 3 是三次样条。 默认值为 3。
-
s (float or None, optional)
正平滑因子用于选择节数。 节点数将增加,直到满足平滑条件:
sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) <= s
但由于数值问题,实际情况是:
abs(sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) - s) < 0.001 * s
如果 s 为 None,则对于使用所有数据点的平滑样条线,s 将设置为 len(w)。 如果为 0,样条曲线将通过所有数据点进行插值。 这相当于 InterpolatedUnivariateSpline。 默认为None。 用户可以使用 s 来控制贴合的紧密度和平滑度之间的权衡。 较大的 s 意味着更多的平滑,而较小的 s 值表明更少的平滑。 s 的推荐值取决于权重 w。 如果权重表示 y 标准差的倒数,则应在 (m-sqrt(2m),m+sqrt(2m)) 范围内找到良好的 s 值,其中 m 是 x、y 和 w 中的数据点。 这意味着如果 1/w[i] 是 y[i] 标准差的估计值,则 s = len(w) 应该是一个不错的值。
-
ext (int or str, optional)
控制不在结序列定义的区间内的元素的外推模式。
如果 ext=0 or ‘extrapolate’, 则返回外推值。
如果 ext=1 or ‘zeros’, 则返回 0。
如果 ext=2 or ‘raise’, 则引发 ValueError。
如果 ext=3 of ‘const’, 则返回边界值。
默认值为 0。
-
check_finite (bool, optional)
是否检查输入数组是否仅包含有限数字。 禁用可能会带来性能增益,但如果输入确实包含无穷大或 NaN,则可能会导致问题(崩溃、非终止或无意义的结果)。 默认值为 False。
注意
数据点的数量必须大于样条度 k。
NaN 处理:如果输入数组包含 nan 值,则结果没有用,因为底层样条拟合例程无法处理 nan。 解决方法是对非数字数据点使用零权重:
import numpy as np
from scipy.interpolate import UnivariateSpline
x, y = np.array([1, 2, 3, 4]), np.array([1, np.nan, 3, 4])
w = np.isnan(y)
y[w] = 0.
spl = UnivariateSpline(x, y, w=~w)
请注意,需要将 nan 替换为数值(只要相应的权重为零,精确值并不重要。)
References 参考
基于[1]、[2]、[3]和[4]中描述的算法:
[1]
P. Dierckx, “An algorithm for smoothing, differentiation and integration of experimental data using spline functions”, J.Comp.Appl.Maths 1 (1975) 165-184.
[2]
P. Dierckx, “A fast algorithm for smoothing data on a rectangular grid while using spline functions”, SIAM J.Numer.Anal. 19 (1982) 1286-1304.
[3]
P. Dierckx, “An improved algorithm for curve fitting with spline functions”, report tw54, Dept. Computer Science,K.U. Leuven, 1981.
[4]
P. Dierckx, “Curve and surface fitting with splines”, Monographs on Numerical Analysis, Oxford University Press, 1993.
示例
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
rng = np.random.default_rng()
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * rng.standard_normal(50)
plt.plot(x, y, 'ro', ms=5)
# 使用平滑参数的默认值:
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw=3)
# 手动更改平滑量:
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw=3)
plt.show()
plt.figure()
plt.plot(x, y, 'ro', ms=3)
spl1 = UnivariateSpline(x, y, k=2, s=1)
spl2 = UnivariateSpline(x, y, k=3, s=1)
spl3 = UnivariateSpline(x, y, k=4, s=1)
spl4 = UnivariateSpline(x, y, k=5, s=1)
spl5 = UnivariateSpline(x, y, k=3, s=1)
spl6 = UnivariateSpline(x, y, k=3, s=3)
spl7 = UnivariateSpline(x, y, k=3, s=5)
xs = np.linspace(-3, 3, 100)
plt.plot(xs, spl1(xs), color='r', lw=1, label="k=2, s=1, red")
plt.plot(xs, spl2(xs), color='g', lw=1, label="k=3, s=1, green")
plt.plot(xs, spl3(xs), color='b', lw=1, label="k=4, s=1, blue")
plt.plot(xs, spl4(xs), color='c', lw=1, label="k=5, s=1, cyan")
plt.plot(xs, spl5(xs), color='m', lw=1, label="k=3, s=1, magenta")
plt.plot(xs, spl6(xs), color='y', lw=1, label="k=3, s=3, yellow")
plt.plot(xs, spl7(xs), color='k', lw=1, label="k=3, s=5, black")
plt.legend()
plt.show()
方法
名称 | 说明 |
---|---|
__call__ (x[, nu, ext]) | 计算位置 x 处的样条曲线(或其 nu 阶导数)。 |
antiderivative ([n]) | 构造一个代表该样条线的反导数的新样条线。 |
derivative ([n]) | 构造一个新样条线,表示该样条线的导数。 |
derivatives (x) | 返回样条曲线在点 x 处的所有导数。 |
get_coeffs () | 返回样条系数。 |
get_knots () | 返回样条线内部结的位置。 |
get_residual () | 返回样条近似值的残差平方和的加权和。 |
integral (a, b) | 返回两个给定点之间样条线的定积分。 |
roots () | 返回样条曲线的零点。 |
set_smoothing_factor (s) | 使用给定的平滑因子 s 和上次调用时找到的结继续进行样条计算。 |
scipy/reference/generated/scipy.interpolate.UnivariateSpline.roots.html#scipy.interpolate.UnivariateSpline.roots)() | 返回样条曲线的零点。 |
| set_smoothing_factor
(s) | 使用给定的平滑因子 s 和上次调用时找到的结继续进行样条计算。 |