我正在学习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这样做的麻烦。
答案 0 :(得分:2)
这里有几件事需要考虑。首先,您发布的示例代码可能出现的错误提到:“x和y必须具有相同的第一维”。
要解决此问题,您需要对count/sum(count)
/ t
数组执行的pos
数组执行相同的逻辑索引:
neg
plt.plot(t[posthresh],pos,'r-')
plt.plot(t[negthresh],neg,'g-')
绘制连接线(使用plt.plot()
markerstyle时),这意味着所有间隙都连接在一起。
要解决这个新问题,您可以利用matplotlib处理NaN值的方式(它忽略它们,并将该行断开,直到下一个非NaN)。你可以这样看到这种行为:
'-'
这仍然不是你所需要的,但我们越来越近了。请注意,由于两个问题,每行的断边不会完全变为零:
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
,其中不包含完全零值。频率为3时,信号将以< 0
的倍数交叉为零,因此您应确保采样率包含以下每个值:
t/6
我们还会调整条件来解决浮点错误:
# sample at 1/60 to get 10 points between each zero crossing
t = np.arange(0., 5., 1/60.)
结果看起来很棒!