Python中的对数插值

18

使用numpy.interp,我能够计算给定离散数据点上的函数的一维分段线性插值。

是否有类似的函数可以返回对数插值?


1
从你的问题中并不清楚你所说的“对数插值”具体是什么意思。你能给出一些输入/输出的例子吗? - ali_m
2个回答

27

过去,我只是将正常的插值包装起来,以对数空间进行插值,即

def log_interp(zz, xx, yy):
    logz = np.log10(zz)
    logx = np.log10(xx)
    logy = np.log10(yy)
    return np.power(10.0, np.interp(logz, logx, logy))

就我个人而言,我更喜欢scipy插值函数(正如@mylesgallagher所提到的),例如:

import scipy as sp
import scipy.interpolate

def log_interp1d(xx, yy, kind='linear'):
    logx = np.log10(xx)
    logy = np.log10(yy)
    lin_interp = sp.interpolate.interp1d(logx, logy, kind=kind)
    log_interp = lambda zz: np.power(10.0, lin_interp(np.log10(zz)))
    return log_interp

那么你可以将其作为函数对任意值进行调用。


我已经尝试过这种方法,但它无法插值超出插值范围的值。你知道估算新值的方法吗? - Luis González
1
@LuisGonzález scipy对于外推并没有广泛的支持,但可以查看这个答案:https://dev59.com/GHE85IYBdhLWcg3wgDvd#8166155,注意:特别是使用样条插值进行外推时,可能会导致意外的行为(例如曲线在输入范围之外会急剧“转向”)。 - DilithiumMatrix

0

如果我理解正确,您有一些离散数据,想要得到一组平滑的值,这些值将出现在您拥有的值之间。我假设您不想要一个近似数据的对数函数方程。

不幸的是,NumPy除了线性分段插值之外没有其他东西,但是如果您考虑使用SciPy,它确实具有更强大的插值函数。请参阅SciPy的插值文档以获取更多详细信息。

它包括更复杂的插值方法,如“三次”插值,这将为您提供非常平滑的近似值,但它不会是对数,并且不会给您一个方程。

如果您想要一个方程,您需要的是回归技术而不是插值,但我认为您不需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接