假设给一个人一个列表,表示事件发生的时间.事件的开始标记为1,事件的结束标记为-1.否则,对于每个采样的时间点,它都是0.举个简单的例子:

event_list = [0,0,0,0,1,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,-1,0,0,0,0,0,1,0,0,0,0,0,-1,0,0]

我想找到一个简单的方法,将该列表转换为步长函数,其中事件的开始由1表示,事件的持续时间都是1,当事件结束时,它返回到0.因此,对于与上面相同的列表,它看起来像:

step_list = [0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0]

现在,可以通过在列表上循环并使用if语句和缓冲区来创建新列表来强制执行此操作.但必须有一种比这更优雅的方式.我想在numpy中使用diff函数,但这仍然不太管用.谢谢你的建议!

推荐答案

可能有一种更优雅的方法(numpy可能会令人惊讶),但您可以通过两个步骤来实现这一点,即.cumsum()和索引替换:

import numpy as np
x = np.array(event_list)

result = x.cumsum()
result[x == -1] = 1

输出:

>>> np.array_equal(result, step_list)
True

这是通过首先获取元素的累积和来实现的.遇到的第一个1将总和设置为1.它后面跟着零(这意味着总和保持在1),直到遇到-1,然后总和"重置"回0(直到遇到下一个1).这本质上是将1"向前填充"到-1,但不包括-1,因此最后一步是简单地将1分配给索引,其中原始数组的值为-1.

Python相关问答推荐

如何标记Spacy中不包含特定符号的单词?

avxspan与pandas period_range

Python+线程\TrocessPoolExecutor

如何在FastAPI中为我上传的json文件提供索引ID?

在极中解析带有数字和SI前缀的字符串

并行编程:同步进程

不允许 Select 北极滚动?

如何删除重复的文字翻拍?

如何在GEKKO中使用复共轭物

如何在验证文本列表时使正则表达式无序?

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样

如何在Quarto中的标题页之前创建序言页

按列表分组到新列中

如何在networkx图中提取和绘制直接邻居(以及邻居的邻居)?

牛郎星直方图中分类列的设置顺序

如何定义一个将类型与接收该类型的参数的可调用进行映射的字典?

大Pandas 每月重新抽样200万只和300万只

如何强制SqlalChemy指向与连接字符串的默认架构不同的架构

给定y的误差时,线性回归系数的计算误差