要插值数据,我目前使用此功能:

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等效于x在带有dx=(x[-1]-x[0])/x.size的常规网格上重新采样。如何执行同样的操作,但对数刻度上的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)


我的答案也是如此。

关于python - 在Python中以对数标度进行插值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20045947/

10-12 14:55