在python中按对数比例插值

在python中按对数比例插值,python,numpy,scipy,interpolation,logarithm,Python,Numpy,Scipy,Interpolation,Logarithm,要插入我的数据,我当前使用此函数: def myinterp(x, y, der = 0, s = 0): tck = interpolate.splrep(x, y, s = sigma) xnew = np.arange(x[0], x[-1], (x[-1]-x[0])/x.size) ynew = interpolate.splev(xnew, tck, der = n) return xnew, ynew xnew相当于使用dx=(x[-1]-x[0]

要插入我的数据,我当前使用此函数:

def myinterp(x, y, der = 0, s = 0):
    tck = interpolate.splrep(x, y, s = sigma)
    xnew = np.arange(x[0], x[-1], (x[-1]-x[0])/x.size)
    ynew = interpolate.splev(xnew, tck, der = n)
    return xnew, ynew

xnew
相当于使用
dx=(x[-1]-x[0])/x.size在常规网格上重新采样的
x
。如何进行同样的操作,但在对数尺度上对
x
进行重采样?

您可以只取对数,对其进行线性重采样,然后取其指数:

xnew = np.exp(np.arange(log(x[0]), log(x[-1]), log(x[-1]/x[0])/x.size))
由于重复调用exp,结果可能会非常昂贵。一种更有效但稍微麻烦的方法是利用以下事实,即在对数标度下,后续元素之间存在一个常数因子:

f = pow(x[-1]/x[0], 1.0/(x.size-1) )
xnew[0] = x[0]
for i in range(1,x.size):
    xnew[i] = xnew[i-1] * f
编辑:您的问题是dx=(x[-1]-x[0])/x.size,这对我来说很奇怪,如果您想使用所需的相同数组大小表示相同的范围

dx=(x[-1]-x[0]) / (x.size-1)

这同样适用于我的答案。

你只需取对数,再对其进行线性采样,然后取其指数:

xnew = np.exp(np.arange(log(x[0]), log(x[-1]), log(x[-1]/x[0])/x.size))
由于重复调用exp,结果可能会非常昂贵。一种更有效但稍微麻烦的方法是利用以下事实,即在对数标度下,后续元素之间存在一个常数因子:

f = pow(x[-1]/x[0], 1.0/(x.size-1) )
xnew[0] = x[0]
for i in range(1,x.size):
    xnew[i] = xnew[i-1] * f
编辑:您的问题是dx=(x[-1]-x[0])/x.size,这对我来说很奇怪,如果您想使用所需的相同数组大小表示相同的范围

dx=(x[-1]-x[0]) / (x.size-1)

这同样适用于我的答案。

如何将值转换为对数空间,线性插值,然后再转换回?如何将值转换为对数空间,线性插值,然后再转换回?