gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:01:26 25 4
gpt4 key购买 nike

我有一个长 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com