python - 如何识别 boolean 数组中的值序列?

标签 python list python-3.x boolean

我有一个长 boolean 数组:

bool_array = [ True, True, True, True, True, False, False, False, False, False, True, True, True, False, False, True, True, True, True, False, False, False, False, False, False, False ]

我需要找出值翻转的位置,即 TrueFalse 序列开始的地址。在这种特殊情况下,我想得到

index = [0, 5, 10, 13, 15, 19, 26]

有没有一种简单的方法可以不用手动循环检查每个第 i 个元素与第 (i+1) 个元素?

最佳答案

作为处理大型数据集的更有效方法,在 python 3.X 中您可以使用 accumulategroupby itertools 模块中的函数。

>>> from itertools import accumulate, groupby
>>> [0] + list(accumulate(sum(1 for _ in g) for _,g in groupby(bool_array)))
[0, 5, 10, 13, 15, 19, 26]

代码背后的逻辑:

此代码使用 groupby() 函数对顺序重复项进行分类,然后遍历 groupby() 返回的迭代器,该迭代器包含键对(我们使用下划线而不是丢弃变量对其进行转义)和这些分类迭代器。

>>> [list(g) for _, g in groupby(bool_array)]
[[True, True, True, True, True], [False, False, False, False, False], [True, True, True], [False, False], [True, True, True, True], [False, False, False, False, False, False, False]]

所以我们只需要计算这些迭代器的长度,并将每个长度与其之前的长度相加,以获得第一个项目的索引,这正是项目被更改的地方,这正是 accumulate () 函数是为了。

在 Numpy 中,您可以使用以下方法:

In [19]: np.where(arr[1:] - arr[:-1])[0] + 1
Out[19]: array([ 5, 10, 13, 15, 19])
# With leading and trailing indices
In [22]: np.concatenate(([0], np.where(arr[1:] - arr[:-1])[0] + 1, [arr.size]))
Out[22]: array([ 0,  5, 10, 13, 15, 19, 26])

关于python - 如何识别 boolean 数组中的值序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894822/

相关文章:

Java 将 Set<Set<String>> 转换为 List<List<String>>

R4.0 性能 : dataframes vs lists, 循环与向量化 - 常数向量减法示例

list - 如何从 Scala 中的 hashmap 调用函数

python - 使用正则表达式 Pandas Dataframe 进行电子邮件验证

python - Flask:在模板中放置静态 javascript 文件的位置

python - 如何在 numpy 中内部连接两个数组?

python - 我有一个嵌套列表,但我想在嵌套列表内添加一个嵌套列表

python - Python 中的 Dict 如何工作?它是类中的静态成员吗​​?

python - 值更新的 Json 写入问题

python - 在csv文件中打印行?