我有一个长 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 ]
我需要找出值翻转的位置,即 True
和 False
序列开始的地址。在这种特殊情况下,我想得到
index = [0, 5, 10, 13, 15, 19, 26]
有没有一种简单的方法可以不用手动循环检查每个第 i 个元素与第 (i+1) 个元素?
最佳答案
作为处理大型数据集的更有效方法,在 python 3.X 中您可以使用 accumulate
和 groupby
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/