Python:Scipy.interpolate
注意
以下插值函数中,待插值点的坐标,最好按次序排列(参与插值的基准点的坐标可以打乱次序)。如果打乱顺序,可能会导致插值结果异常(插值异常而不是错误,不会报错,但是结果有明显异常)。
griddata
官方网站:scipy.interpolate.griddata — SciPy v1.7.1 Manual
说明
多维插值,由部分已知点坐标对和点值来对整个区域的坐标上的值进行预测,即插值。
用法
scipy.interpolate.griddata(points, values, xi, method='linear',
fill_value=nan, rescale=False)
参数
以下的D,均为维度的意思。
参数 |
类型 |
默认值 |
说明 |
points |
2D ndarray,尺寸为(n,D) 或 1D ndarray,长度为n,每个元素都是一个包含D个元素的元组 |
点坐标。 假设有9个二维点,其坐标分别从(0,0)到(2,2)(想像一个长为3的正方形),那么它在写为该项参数时,要么是2D ndarray : [[0,1,2,0,1,2,0,1,2], #一共2行,第一行是横坐标 [0,1,2,0,1,2,0,1,2] #第二行是纵坐标 ] 要么是1D ndarray: [(0,0),(0,1),(0,2),(1,0),...,(2,1),(2,2)] #这些点的坐标构成的array
假设有8个三维点,其坐标分别从(0,0,0)到(1,1,1)(想像一个棱为2的正方体),那么它在写为该项参数时,要么是2D ndarray: [[0,1,0,1,0,1], #一共3行,第一行是X坐标 [0,1,0,1,0,1], #第二行是Y坐标 [0,1,0,1,0,1] #第三行是Z坐标 ] 要么是1D ndarray: [(0,0,0),(0,0,1),(0,1,0),(0,1,1),...,(1,1,0),(1,1,1)] #这些点的坐标构成的array
|
|
values | float或者complex的1D ndarray,长度为n(和坐标点数相同) | 这些坐标点处的值。 | |
xi |
2D ndarray,尺寸为(n,D) 或 1D ndarray,长度为n,每个元素都是一个包含D个元素的元组 |
待插值的点的坐标,写法形式与参数points相同。 | |
method | {‘linear’, ‘nearest’, ‘cubic’} | 'linear' | 插值方式 |
fill_value | float | nan |
如果待插值点位于初始点凸包外部,那么这些点将不会被插值,而是用这个参数给定的值代替。 如果这个值没有给出,那么默认值是nan。 这个参数在'nearest'插值时将不会起作用。 |
rescale | bool | 插值前是否进行重规格化,在某些轴数值相差过大时起作用 |
返回值
1D ndarray,长度和插值点个数相同,其中存放这些点对应的值。
interp2d
官方网站:scipy.interpolate.interp2d — SciPy v1.7.1 Manual
说明
2D网格插值,区别于griddata,后者用于多维插值,而interp2d专用于2维插值。
用法
interp2d(x, y, z, kind='linear', copy=True,
bounds_error=False, fill_value=None)
参数
参数 |
类型 |
默认值 |
说明 |
x,y | 1D array |
两种写法: ①如果点分布于规则网格中,比如点是一个3*2的矩阵上的六个点,那么x,y只指明矩阵的横纵坐标即可: x = [0,1,2]; y = [0,3]; z = [[1,2,3], [4,5,6]] ②其他情况下,需要在x中写明所有点的横坐标,在y中写明所有点的纵坐标(每个位置处都与x一一对应构成一个完整的点坐标): x = [0,1,2,0,1,2]; y = [0,0,0,3,3,3]; z = [1,2,3,4,5,6] |
|
z | 1D array或2D array |
指定坐标点(x,y)处的z值,需要一一对应。 在x,y的说明中,给出了两种x,y的情况以及其对应的z的写法。 |
|
kind | {‘linear’, ‘cubic’, ‘quintic’} | ‘linear’ | 插值方法 |
copy | bool | True | 是否在内部保留x,y,z,比较少用 |
bounds_error | bool | False |
如果是True,那么当区域外的值需要插值时,会弹出ValueError; 否则会用fill_value来填充这些值 |
fill_value | number |
如果有该项,那么区域外的值会设置为该值。 如果忽略,那么区域外的值会通过最近邻外推法得到。 |
返回值
一个函数f,它接收两个参数x和y。
就是说,我们通过原x,y,z来构造函数z = f ( x , y ),再通过f、xnew、ynew来预测znew,即插值:
f = interp2d(x,y,z)
z_new = f(x_new , y_new)
其中x_new、y_new、z_new的写法和原x、y、z相同。
例子
构造一个2D 网格并对其插值,通过interp2d获得插值函数f:
from scipy import interpolate x = np.arange(-5.01, 5.01, 0.25) y = np.arange(-5.01, 5.01, 0.25) xx, yy = np.meshgrid(x, y) z = np.sin(xx**2+yy**2) f = interpolate.interp2d(x, y, z, kind='cubic')
用f对x_new、y_new进行插值,得到最终的z_new:
import matplotlib.pyplot as plt xnew = np.arange(-5.01, 5.01, 1e-2) ynew = np.arange(-5.01, 5.01, 1e-2) znew = f(xnew, ynew) plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-') plt.show()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性