提取numpy数组中所有1序列的第一个和最后一个索引并将它们附加到列表中?

Posted

技术标签:

【中文标题】提取numpy数组中所有1序列的第一个和最后一个索引并将它们附加到列表中?【英文标题】:Extract the first and last indices of all sequences of 1s in a numpy array and append them to a list? 【发布时间】:2022-01-14 14:06:03 【问题描述】:

我有一个包含 1 和 0 的音频文件(时间序列)的掩码向量。掩码向量将包含长序列,当有一些有利的活动时,音频信号中的间隔为 1,当有噪声时为 0。我想基本上从音频信号中提取所有活动部分并将它们存储为单独的音频文件。出于这个原因,如果我能找到从掩码向量中提取所有 1 序列的开始和结束索引并将它们附加到列表中的最有效方法,将会很有帮助。

【问题讨论】:

那么基本上,每组 1 被一个或多个 0 分隔应该在自己的文件中? 是的,没错。实际上,在两个 1 序列之间会有 1000 个 0。 【参考方案1】:

给定您的data,您可以通过索引 1 创建idx,并使用np.split 将其拆分为连续索引的子数组。

data = pd.Series([1,1,1,0,0,1,0,0,1,1])
idx = data[data==1].index.values
out = [arr[[0,-1]] for arr in np.split(idx, np.where(np.diff(idx) != 1)[0]+1)]

因此,在本例中,1 在索引 0-258-9 中分别出现了 3 次:

[array([0, 2], dtype=int64),
 array([5, 5], dtype=int64),
 array([8, 9], dtype=int64)]

【讨论】:

【参考方案2】:

我会这样做:

groups = df.groupby(df['your_col'].ne(df['your_col'].shift(1)).cumsum()[df['your_col'].eq(1)])
for _, group in groups:
    # At this point, 'group' is a separate dataframe containing all the rows where 'your_col' is consecutively 1
    # ...

基本上它的作用是按连续的 1 对行进行分组(每组一个或多个零结束前一组 1),然后循环遍历每个组(这是原始数据帧的一部分)。

【讨论】:

以上是关于提取numpy数组中所有1序列的第一个和最后一个索引并将它们附加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

Numpy数组索引为-1和None

通过指定子字符串的第一个和最后一个来提取字符串中的子字符串

numpy - 返回数组中元素的第一个索引[重复]

从 numpy.uint8 数组中提取无符号字符

python怎么操作多维数组元素

NumPy之 索引技巧