我有两个长度相同的列表。第一个列表是时间,第二个列表是具有三个值0、1、2
的信号。例如,
t = [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0,
110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0,
210.0, 220.0, 230.0, 240.0, 250.0, 260.0, 270.0, 280.0, 290.0, 300.0,
310.0, 320.0, 330.0, 340.0, 350.0, 360.0, 370.0, 380.0, 390.0]
s = [2, 1, 2, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 2, 2, 1, 1, 2, 1, 2]
信号:
我想计算信号非零和零时的时间间隔。结果应该是
t_nonzero = [40, 10, 10, 10, ...]
t_zero = [20, 10, 40, 70, ...]
Python中有没有一种有效的方法来做到这一点?
最佳答案
这就足够了:
start = t[1]
sig = s[1]==0 # init signal
n = [] # non zero
z = [] # zero
for i,(x,y) in enumerate(zip(t[1:],s[1:])):
cur = y==0 # current signal
# signal changes or meets the last frame
if sig != cur or i == len(t[1:])-1:
off = x - start
z.append(off) if sig else n.append(off)
start = x
sig = cur
请注意,第一帧被丢弃。
<小时/>更新:另一个解决方案是对信号进行计数。
def fn(n):
n[-1] += 1
n = [0] # non-zero
[fn(n) if x != 0 else n.append(0) for x in s[1:]] # discard the first frame
n = [x * 10 for x in n if x > 0]
z = [0] # zeros list
[fn(z) if x == 0 else z.append(0) for x in s[1:]]
z = [x * 10 for x in z if x > 0]
关于python - 如何在Python中计算非零信号之间的时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54228394/