python插值(scipy.interpolate模块的griddata和Rbf)
1.插值scipy.interpolate
SciPy的interpolate模块提供了许多对数据进⾏插值运算的函数,范围涵盖简单的⼀维插值到复杂多维插值求解。
1. ⼀维插值:当样本数据变化归因于⼀个独⽴的变量时;
2. 多维插值:反之样本数据归因于多个独⽴变量时。
注:⼀维插值这⾥就不再讲述了,主要是对⼆维插值的⼀个总结。
2.interp2d()
from scipy.interpolate import interp2d
interp2d(x,y,z,kind='linear')
这⾥有⼏个注意事项:
1. interp2d()中,输⼊的x,y,z先⽤ravel()被转成了⼀维数组
2. func()的输⼊必须是⼀维的,输出是⼆维的(有点奇怪,感觉完成度不⾼)
3. 插值的源数据必须是等距⽹格。不然的haul,运⾏不保存但结果不对。
3.Rbf()
Rbf的优点是,排列可以⽆序,可以不是等距的⽹格。
1. 随机⽣成点,并计算函数值
2. 插值(输⼊输出都是⼆维)
from scipy.interpolate import Rbf
func = Rbf(x, y, z, function='linear')# 插值
z_new = func(x1, y1)
x,y,z实际的数据,都是⼀维数组
function为插值⽅法,有‘linear’,‘cubic’等
x1,y1为⽹格数据,z_new为插值后的数据,都是⼆维的
由于我们必须将 2d 点作为形状为 (N, 2) 的数组传递,因此我们必须展平输⼊⽹格并堆叠两个展平的阵列。 构造的插值器也需要这种格式的查询点,结果将是⼀个形状为 (N,) 的⼀维数组,我们必须重新整形以匹配我们的⼆维⽹格以进⾏绘图。 由于 Rbf 不对输⼊点的维数做任何假设,因此它⽀持插值的任意维数。
所以,scipy.interpolate.Rbf
1. 即使对于疯狂的输⼊数据也能产⽣良好的输出
2. ⽀持更⾼维度的插值
3. 在输⼊点的凸包外外推(当然外推总是⼀场赌博,您通常根本不应该依赖它)
4. 创建⼀个插值器作为第⼀步,因此在不同的输出点对其进⾏评估会减少额外的⼯作量
5. 可以有任意形状的输出点数组(与被限制为矩形⽹格相反,见下⽂)
6. 更有可能保持输⼊数据的对称性
7. ⽀持关键字核的多种径向函数:multiquadric、inverse_multiquadric、inverse_quadratic、gaussian、linear、cubic、
quintic、thin_plate_spline(默认)。从 SciPy 1.7.0 开始,由于技术原因,该类不允许传递⾃定义可调⽤项,但这可能会在未来版本中添加。
8. 可以通过增加平滑参数给出不精确的插值
4. griddata()
from scipy.interpolate import griddata
griddata(points,values,xi,method =‘linear’,fill_value = nan,rescale =False)
参数:
points:数据点坐标。可以是形状(n,D)的数组,也可以是ndim数组的元组。(已知点)
values:浮点或复数的ndarray,形状(n,)的数据值。(已知点对应的值)
xi :浮点数的⼆维数组或⼀维数组的元组,形状(M,D)插值数据的点。(被划分后的⽹格)
method:‘linear’,‘nearest’,‘cubic’,可选其中的插值⽅法之⼀。(插值⽅式)
{
nearest 返回最接近插值点的数据点的值。
linear 将输⼊点设置为n维单纯形,并在每个单形上线性插值。
cubic (1-d)返回由三次样条确定的值。
cubic (2-d)返回由分段⽴⽅,连续可微(C1)和近似曲率最⼩化多项式表⾯确定的值。
}
fill_value :float,可选。⽤于填充输⼊点凸包外部的请求点的值。如果未提供,则默认为nan。此选项对“最近”⽅法⽆效。
rescale :bool,可选。在执⾏插值之前,重新缩放指向单位⽴⽅体。如果某些输⼊维度具有不可⽐较的单位并且相差很多个数量级,则这⾮常有⽤。
5.⼆维插值griddata和Rbf对⽐
注:不考虑内存,CPU,只针对相当⼩的数据集,主要考虑插值的质量。
1. griddata基于提供的点的Delaunay三⾓部分。然后将数据插值到每个单元(三⾓形)上。例如,对于2D函数和线性插值,三⾓形内
部的值是经过三个相邻点的平⾯。
2. rbf通过为每个提供的点分配⼀个径向函数来⼯作。“径向”表⽰该功能仅取决于到该点的距离。任何点的值都是通过所有提供的点的
加权贡献之和得出的。只要定义了距离函数,该⽅法就不管变量空间的⼤⼩都适⽤。
Rbf 内插的⼀个缺点是内插 N 个数据点涉及对 N x N 矩阵求逆。 这种⼆次复杂性⾮常迅速地破坏了⼤量数据点的内存需求。 但是,新的RBFInterpolator 类还⽀持邻居关键字参数,该参数将每个径向基函数的计算限制为 k 个最近的邻居,从⽽减少内存需求。
z_dense_smooth_griddata = iddata((x_sparse.ravel(), y_sparse.ravel()),
z_sparse_smooth.ravel(),(x_dense, y_dense), method='cubic')
输出点数组可以指定为任意维度数组的元组(如上述两个⽚段),这为我们提供了更⼤的灵活性。
linspace函数python简⽽⾔之,iddata
1. 即使对于疯狂的输⼊数据也能产⽣良好的输出
2. ⽀持更⾼维度的插值
3. 不执⾏外推,可以为输⼊点凸包外的输出设置单个值(参见fill_value)
4. 在单个调⽤中计算内插值,因此从头开始探测多组输出点
5. 可以有任意形状的输出点
6. ⽀持任意维度的最近邻和线性插值,1d 和 2d 中的三次。最近邻和线性插值分别在引擎盖下使⽤ NearestNDInterpolator 和
LinearNDInterpolator。 1d 三次插值使⽤样条,2d 三次插值使⽤ CloughTocher2DInterpolator 构造⼀个连续可微的分段三次插值器。
7. 可能违反输⼊数据的对称性
6.插值举例
站点数据插值:地图⽹格插值:
1. 取经纬度:lon,lat (经纬度数组,n)
2. 取站点的观测数据集:data (这个数据维度与站点数量同,即1*n)
3. 准备两个列表⽤于构造⽹格矩阵:
olon = np.linspace(108,115,97)
olat = np.linspace(24,31,97)
4. 构造⽹格矩阵
olon,olat = np.meshgrid(olon,olat)
5. 做插值:(需要到⼊Rbf函数:from scipy.interpolate import Rbf)
func = Rbf(lon,lat,data,function=‘linear‘)
rain_data_new = func(olon,olat)
6. 或griddata插值
rain_data_new = griddata((lon,lat), data, (olon,olat), method='linear')
注:由于Rbf插值要求矩阵可逆,所以在经纬度列表时,不能有相同的两⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论