Python:平方和指数插值

Python: Square and exponential interpolation

我有以下问题,

我有一个巨大的 3D 矩阵,想要将数字范围映射到其他数字范围。我必须遵守一些条件。例如,在某些情况下,我需要对第一个线性范围和第二个二次或指数范围进行插值。计算必须非常快 对于整个范围内的线性插值,我可以通过展平矩阵、执行 scipys interp1d 并在此之后重塑矩阵来实现。对于此示例,矩阵已经变平并且只有一小部分 x 值。真正的矩阵有大约 150000-20000 x 值:

import numpy as np
from scipy.interpolate import interp1d

xValues=np.array([1,2,3,4,5,6,7])
interpolateFunction = interp1d([0,2,2.01,6],[-15,-1,15,1],fill_value=0,bounds_error=False)
print(interpolationFunction(xValues))

现在我想知道是否有可能对平方函数和指数函数而不是线性函数也这样做,interp1d 是如何做到的,以及像我上面解释的那样以不同的方式处理多个范围。例如,我想将范围 [0,2] 线性内插到 [-15,-1],将范围 [2.01,6] 指数内插到 [-15,-1]。对于线性和二次方的情况,它可能看起来像这样(对不起这幅画):

我不确定您是否有意希望插值函数在 x=2 处不连续,但我认为以下代码可以满足您的需求(假设您已将 3D 张量展开为 1D 数组) :

linearFn = interp1d([0, 2], [-15, -1], fill_value='extrapolate')
gain = 0.25 * np.log(15)

linearVals = linearFn(xValues)
expoVals = -15 * np.exp(-gain * (xValues - 2))
interpolated = np.where(xValues <= 2, linearVals, expoVals)

假定插值函数的指数位具有 y=-15*exp(-(x-2)*log(15)/4) 的形式,这与 x=2 处的边界条件一致x=6.

如果将此应用到 xValues = np.linspace(0, 6, 100),您会得到如下图表: