SciPy中已弃用的interp1d线性插值函数的替代方案咨询
SciPy中已弃用的interp1d线性插值函数的替代方案咨询
嘿,我刚好踩过这个坑!现在SciPy里interp1d确实已经被标记为弃用了,如果你需要实现和它一样的线性插值+返回可调用插值函数的效果,有两个非常顺手的替代方案:
方案一:使用LinearNDInterpolator
这个插值器原生支持1D到ND的线性插值,用法和你原来的interp1d几乎无缝衔接,初始化后直接就能像函数一样调用计算插值结果。
修改后的代码示例:
import numpy as np from scipy.interpolate import Akima1DInterpolator, LinearNDInterpolator import matplotlib.pyplot as plt t = np.linspace(0.0, 1.0, 4) y = np.array([1.0, 0.8, 0.7, 1.2]) # 替代原来的interp1d(kind="linear") ak = LinearNDInterpolator(list(zip(t)), y) tt = np.linspace(0.0, 1.0, 200) # LinearNDInterpolator需要输入为2D数组,所以这里给tt加个维度 yy = ak(tt.reshape(-1, 1)) plt.plot(tt, yy) plt.plot(t, y, "x") plt.gca().set_aspect("equal") plt.show()
方案二:使用make_interp_spline并指定k=1
如果你更习惯贴近interp1d的调用逻辑,make_interp_spline设置k=1就等价于线性插值,它同样会返回一个可调用的插值函数,用法和你原来的代码几乎完全一致。
修改后的代码示例:
import numpy as np from scipy.interpolate import Akima1DInterpolator, make_interp_spline import matplotlib.pyplot as plt t = np.linspace(0.0, 1.0, 4) y = np.array([1.0, 0.8, 0.7, 1.2]) # k=1指定线性插值,完美替代interp1d的linear模式 ak = make_interp_spline(t, y, k=1) tt = np.linspace(0.0, 1.0, 200) yy = ak(tt) plt.plot(tt, yy) plt.plot(t, y, "x") plt.gca().set_aspect("equal") plt.show()
运行上述任意一段代码后,你都会得到和原来一样的插值效果:一条连接原始数据点的线性分段曲线,原始的4个数据点用"x"标记在图上,坐标轴保持等比例显示。
备注:内容来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

