Scipy三维插值
插值运算在科学计算任务中非常常见,而scipy又是使用python进行科学计算任务的必备工具之一。关于如何使用scipy进行一位和二维插值官方文档介绍的已经非常详细,基本上根据demo操作就能搞清楚怎么使用scipy进行一维和二维插值。但是有时发现自己需要使用scipy进行三维和更高维插值,然而官方文档对于如何进行高维插值介绍的十分简略,很难看懂,这里详细分析一下怎么使用scipy.interpolate.interpn实现n维插值。
1.官方文档介绍
scipy.interpolate.interpn(
points,
values,
xi,
method='linear',
bounds_error=True,
fill_value=nan)
points:形如 (m1, ), …, (mn, ) 的numpy浮点数组元组,用来定义n维插值的空间,每个元素相当于一个维度坐标轴上已知数据点的坐标值,比如三维插值,传入元组的三个元素代表已知数据点在x,y,z三个坐标轴上的坐标值,这里看不懂可以看示例。
values:类似于数组,形如 (m1,…,mn) 的已知数据点对应的值,和point在每个维度上一一对应,表示已知数据点的值。
xi:n 维 numpy数组,和point在维度上一一对应,表示需要获取值的点在每个维度上的坐标值,如果是三维,表明你传入的是坐标(x,y,z),希望得到f(x,y,z)。
method : 插值实现方法,和一维、二维类似,一般由 linear和 nearest等插值方法。
bounds_error: 当传入的 xi某个或者多个坐标值不在给定插值空间(空间范围由 points每个维度上的最大和最小值划定)中时是否抛出错误,默认 True,如果设置为 False,当 fill_value为 False,将会返回 numpy NAN值。
fill_value :设置为 True,当 xi不在给定插值空间时,根据一定的算法的计算出某个值,如果 xi 距离给定插值空间比较远,通常这个值误差很大。
示例
import numpy as np
from scipy.interpolate import interpn
# 维度1x2
x_p = np.array([0.1, 0.5])
# 维度1x3
y_p = np.arange(0, 3, 1)
# 维度1x16
z_p = np.arange(2, 10, 0.5)
# points必须是递增序列
points = (
# 第一维变量x采样点
x_p,
# 第二维变量y采样点
y_p,
# 第三维变量z采样点
z_p
)
# f(x,y,z)采样值
# 维度2x3x16,对应points中的维度
values = np.array([
np.array([np.linspace(1, 29, 16), np.linspace(8, 50, 16), np.linspace(100, 200, 16)]),
np.array([np.linspace(5, 28, 16), np.linspace(6, 74, 16), np.linspace(30, 210, 16)])
])
# 插值查询点xi,yi,zi
xi = [0.2, 3, 3.6]
# 插值
res = interpn(
points,
values, xi,
# 外插时自动填充值,而不是nan
fill_value=True,
# 允许外插
bounds_error=False,
method='linear')
print(res[0])