python - 如何在Python中计算非零信号之间的时间间隔

标签 python

我有两个长度相同的列表。第一个列表是时间,第二个列表是具有三个值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]

信号:

signal

我想计算信号非零和零时的时间间隔。结果应该是

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/

相关文章:

python - 使用 2 种格式的 Python 更改类型列

python - python中的系统函数是什么

python 从 bash shell 调用自定义函数

python - pkg_resources.DistributionNotFound : 'jsonschema'

python - 加载 Jupyter 服务器扩展时找不到模块

python - 当训练数据明显显示出某种模式时,Sklearn svr 会给出错误的结果

python - Bamboo 日志输出顺序问题

python - Errno 111 连接在 Python 套接字编程中被拒绝

python - 如何创建连接、执行和断开连接的函数

python - Pandas Resample-Sum 无需零填充