如何使用scipy或numpy在分段常数点集上插值?

eh57zj3b  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

我在插补一组分段常数点时遇到了麻烦。为了更好地解释,考虑以下代码:

import numpy as np  
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt

N = 30
Ts = 0.2

times = np.arange(0.0, N * Ts, Ts)
signal = np.concatenate((1.5 * np.ones(10), -0.5 * np.ones(10), np.ones(10)))
interp = UnivariateSpline(times[::3], signal[::3])

signal_interp = interp(times)

plt.plot(times, signal)
plt.plot(times, signal_interp)
plt.show()

我希望signal_interp的图与signal的图重叠,但这并没有发生。
我发现了一些here,但iterp1d被认为是遗留的。
我也试着看here,但我找不到任何指导,为我的具体情况。

qcbq4gxm

qcbq4gxm1#

interp是时间的函数,而不是信号的函数。
你是说
signal_interp = interp(times)

signal_interp = interp(signal)
这给

它仍然不会与初始信号“重叠”。但是样条函数不能具有分段常数函数的形状。它们天生就很光滑。他们就是这么做的。它们被精确地用于不是分段常数。它们看起来能够用你的初始代码产生分段常数行为的原因是,你绘制的只是样条曲线的3个点,每个点重复10次(因为使用的横坐标是signal,它只包含3个值,重复10次)。
然而,您还可以通过减少平滑因子s

interp = UnivariateSpline(times[::3], signal[::3], s=0.1)
plt.plot(times, signal)
plt.plot(times, interp(times))

np interp

对于每对连续点之间的简单线性插值(因此可能较不平滑),

signal_interp = np.interp(times, times[::3], signal[::3])
plt.plot(times, signal)
plt.plot(times, signal_interp)

相关问题