试图将sinwave的正负部分叠加在一起

时间:2016-01-10 19:17:33

标签: python numpy

我正在学习numpy,逻辑索引和matplot。我正在做这个问题,希望你的正面部分是正弦波红色和负面部分绿色。然后叠加它们。我想到了一些方法,但我需要一些帮助。

这就是我所拥有的:

t = np.arange(0.0, 5.0, 1e-2)
freq = 3.0
signal = np.sin(2*np.pi*freq*t)
plt.figure()

posthresh = signal > 0
pos = signal[posthresh]
negthresh = signal <0
neg = signal[negthresh]
plt.plot(t,pos,'r-')
plt.plot(t,neg,'g-')
plt.show()

这就是我所拥有的,但显然它不起作用。我还在考虑另一种方式,对于积极的部分,我删除所有索引信号&lt;但是我遇到了numpy这样做的麻烦。

1 个答案:

答案 0 :(得分:2)

这里有几件事需要考虑。首先,您发布的示例代码可能出现的错误提到:“x和y必须具有相同的第一维”。

要解决此问题,您需要对count/sum(count) / t数组执行的pos数组执行相同的逻辑索引:

neg

一旦修复,你会得到一个情节,但可能不是你想要的那个: resulting plot

plt.plot(t[posthresh],pos,'r-') plt.plot(t[negthresh],neg,'g-') 绘制连接线(使用plt.plot() markerstyle时),这意味着所有间隙都连接在一起。

要解决这个新问题,您可以利用matplotlib处理NaN值的方式(它忽略它们,并将该行断开,直到下一个非NaN)。你可以这样看到这种行为:

'-'

lines with gaps

这仍然不是你所需要的,但我们越来越近了。请注意,由于两个问题,每行的断边不会完全变为零:

  1. 您选择的阈值条件为pos = np.where(posthresh, signal, np.nan) neg = np.where(negthresh, signal, np.nan) # note that t.shape == pos.shape now, so we don't need to index t plt.plot(t, pos, 'r-') plt.plot(t, neg, 'g-') plt.show() > 0,其中不包含完全零值。
  2. 每个时期的采样率并不总是产生零值。
  3. 频率为3时,信号将以< 0的倍数交叉为零,因此您应确保采样率包含以下每个值:

    t/6

    我们还会调整条件来解决浮点错误:

    # sample at 1/60 to get 10 points between each zero crossing
    t = np.arange(0., 5., 1/60.)
    

    结果看起来很棒!

    final image