【问题标题】:Interpolate a plot on certain intervals only仅在特定间隔内插值图
【发布时间】:2019-06-23 19:48:42
【问题描述】:

插值在零处超出数据

尝试绘制沿 y 轴平滑的数据曲率的垂直图(x 与 y)。在整个图(y[0]-y[-1])上尝试了 SciPy.interpolate 的 splev 和 splrep。在这个时间间隔内,x 数据为正数、振荡,并多次下降到零。插值在零处变为负数(过冲)。以下是数据示例:

e = np.array([-0.65067307, -0.61057307, -0.57057307, -0.53057307, -0.49047307,
              -0.45047307, -0.41037307, -0.37037307, -0.33037307, -0.29027307,
              -0.25027307, -0.21017307, -0.17017307, -0.13017307, -0.09007307,
              -0.05007307, -0.00997307,  0.03002693,  0.07002693,  0.11012693,
               0.15012693,  0.19022693,  0.23022693,  0.27022693,  0.31032693])

x = np.array([0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ,
              0.    , 1.1015, 3.0956, 2.2363, 2.4597, 1.8997, 1.5912, 1.6496,
              0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ,
              0.    ])

y = np.arange(e[0],e[-1],0.001)
spl = splrep(e,x)
xDat = splev(y,spl)
plt.plot(x,e,'k.',xDat,y,'r-',lw=0.5)

我需要图表平滑但不围绕零振荡。它应该在零处突然消失。我正在考虑将平滑算法限制为非零(或至少高于某个截止值)数据的间隔。正在寻找关于此事的其他意见。

【问题讨论】:

    标签: python numpy matplotlib scipy smoothing


    【解决方案1】:

    解决了。看看吧……

    from scipy.interpolate import interp1d
    
    y = np.arange(e[0],e[-1],0.001)
    l = [0 if i==0 else 1 for i in interp1d(e,x)(y)]
    xDat = splev(y,splrep(e,x)) * l
    plt.plot(x,e,'k.',xDat[xDat>=0],y[xDat>=0],'r-',lw=0.5)
    

    使用线性插值生成包含非零数据的阶跃函数。将实际数据乘以该函数并仅绘制正值就可以了。感谢您提供有关条件切片的提示...

    【讨论】:

    • 我有一个小问题,我们可以在 splrep 中为同一个 x 传递多个 Y 值进行插值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多