我正在测量并行端口上生成的信号的稳定性。
我们从示波器生成的CSV文件中导入了numpy数组。以下输出是用于显示问题的剥离变体:
import numpy as np
data = np.array([0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0])
t = np.array([0. ,0.0005, 0.001 ,0.0015,
0.002 ,0.0025, 0.003 ,0.0035,
0.004 ,0.0045, 0.005 ,0.0055,
0.006 ,0.0065, 0.007 ,0.0075,
0.008 ])
绘制时看起来像这样。
我正在寻找最简洁的方法来将冲动的持续时间作为列表中的值。
写完之后,我会尝试从头开始自己实现解决方案,我希望的是获得持久时间的首选方式,也许有一个我不知道的那个numpy函数?
答案 0 :(得分:1)
假设输入信号被去抖动,你可以循环遍历数组。
high_times = []
low_high = 0
for i in xrange(len(t) - 1):
if data[i] == 0 and data[i+1] == 1:
low_high = i
elif data[i] == 1 and data[i+1] == 0:
high_times.append(t[i] - t[low_high])
high_times
是每个脉冲信号耗尽的时间列表。
答案 1 :(得分:1)
假设data
是0
和1
的int数组:
1。)这定义了从上一个0
到最后1
的脉冲持续时间:
import numpy as np
idx = t[np.abs(np.diff(data)) == 1]
lasting_times = idx[1::2] - idx[::2]
2。)如果您更喜欢从第一个1
到最后一个1
的持久时间定义:
diff = np.diff(data)
lasting_times = t[diff == -1] - t[1:][diff == 1]
注意强>:
无论如何,您必须处理数据的末尾,即这些解决方案假设data
以0
开头和结尾...
答案 2 :(得分:0)
假设您的数据列表仅包含1和0:
print [(m.start(),m.end()) for m in re.finditer('1+', '0000111100001111')]
输出
[(4, 8), (12, 16)]
答案 3 :(得分:0)
使用itertools模块中的groupby,您可以非常轻松地完成。
from itertools import groupby
#union of the point with duration of the point
val_dt = zip(data[:-1],t[:-1]-t[1:])
#groupby to unite similar values
steps = [ (g[0],sum( h[1] for h in g[1])) for g in groupby(val_dt,lambda s:s[0])]
print steps
#[(0, -0.002), (1, -0.002), (0, -0.002), (1, -0.002)]
从内存管理的角度来看,这种方法并不完美,但它有效。