用LinearNDInterpolator推断

发布于 2021-01-29 16:12:37

我有一个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

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我提出了一种方法,代码很糟糕,但希望它能对您有所帮助。这个想法是,如果您事先知道必须外推的范围,则可以使用线性外推值在数组的边缘添加额外的列/行,然后在新数组上进行内插。这是一个示例,其中一些数据将外推到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行。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看