用LinearNDInterpolator推断
我有一个3D数据集,我想对其进行线性内插和外推。使用可以轻松进行插值scipy.interpolate.LinearNDInterpolator
。该模块只能为参数范围之外的值填写常数/
nan,但是我不明白为什么它不提供打开外推的选项。
查看代码,我看到该模块是用cython编写的。没有cython经验,很难尝试使用代码来实现外推。我可以用纯python代码编写它,但也许其他人还有更好的主意?我的特殊情况涉及一个恒定的xy网格,但是z值不断变化(-100,000),因此插值必须快速,因为每次z值更改时都会运行插值。
给一个基本的例子,根据要求,可以说我有一个像
xyPairs = [[-1.0, 0.0], [-1.0, 4.0],
[-0.5, 0.0], [-0.5, 4.0],
[-0.3, 0.0], [-0.3, 4.0],
[+0.0, 0.0], [+0.0, 4.0],
[+0.2, 0.0], [+0.2, 4.0]]
并说我想在x = -1.5, -0.8, +0.5
和计算值y = -0.2, +0.2,
+0.5
。目前,我正在对每个y值沿x轴执行一维插值/外推,然后对每个x值沿y轴执行一维插值/外推。外推由中的第二个函数完成ryggyr's
answer
。
-
我提出了一种方法,代码很糟糕,但希望它能对您有所帮助。这个想法是,如果您事先知道必须外推的范围,则可以使用线性外推值在数组的边缘添加额外的列/行,然后在新数组上进行内插。这是一个示例,其中一些数据将外推到x
= +-50和y = +-40:import numpy as np x,y=np.meshgrid(np.linspace(0,6,7),np.linspace(0,8,9)) # create x,y grid z=x**2*y # and z values # create larger versions with two more columns/rows xlarge=np.zeros((x.shape[0]+2,x.shape[1]+2)) ylarge=np.zeros((x.shape[0]+2,x.shape[1]+2)) zlarge=np.zeros((x.shape[0]+2,x.shape[1]+2)) xlarge[1:-1,1:-1]=x # copy data on centre ylarge[1:-1,1:-1]=y zlarge[1:-1,1:-1]=z # fill extra columns/rows xmin,xmax=-50,50 ymin,ymax=-40,40 xlarge[:,0]=xmin;xlarge[:,-1]=xmax # fill first/last column xlarge[0,:]=xlarge[1,:];xlarge[-1,:]=xlarge[-2,:] # copy first/last row ylarge[0,:]=ymin;ylarge[-1,:]=ymax ylarge[:,0]=ylarge[:,1];ylarge[:,-1]=ylarge[:,-2] # for speed gain: store factor of first/last column/row first_column_factor=(xlarge[:,0]-xlarge[:,1])/(xlarge[:,1]-xlarge[:,2]) last_column_factor=(xlarge[:,-1]-xlarge[:,-2])/(xlarge[:,-2]-xlarge[:,-3]) first_row_factor=(ylarge[0,:]-ylarge[1,:])/(ylarge[1,:]-ylarge[2,:]) last_row_factor=(ylarge[-1,:]-ylarge[-2,:])/(ylarge[-2,:]-ylarge[-3,:]) # extrapolate z; this operation only needs to be repeated when zlarge[1:-1,1:-1] is updated zlarge[:,0]=zlarge[:,1]+first_column_factor*(zlarge[:,1]-zlarge[:,2]) # extrapolate first column zlarge[:,-1]=zlarge[:,-2]+last_column_factor*(zlarge[:,-2]-zlarge[:,-3]) # extrapolate last column zlarge[0,:]=zlarge[1,:]+first_row_factor*(zlarge[1,:]-zlarge[2,:]) # extrapolate first row zlarge[-1,:]=zlarge[-2,:]+last_row_factor*(zlarge[-2,:]-zlarge[-3,:]) #extrapolate last row
然后您可以插值(xlarge,ylarge,zlarge)。由于所有操作都是numpy
slices操作,因此希望对您而言足够快。z数据更新后,将其复制zlarge[1:-1,1:-1]
并重新执行最后4行。