在numpy数组中查找False-True转换

6

给定一个numpy数组:

x = np.array([False, True, True, False, False, False, False, False, True, False])

我该如何查找从False到True的值转换次数?对于上面的例子,答案应该是2。 我不希望将True到False的转换计入。

根据如何识别布尔数组中的值序列?的答案,以下内容输出将值更改索引,但这并不是我想要的,因为它包括True-False的转换。

np.argwhere(np.diff(x)).squeeze()
# [0 2 7 8]

我知道可以通过遍历数组来实现,但我想知道是否有更快的方法?

2个回答

9

获取一次性切片 - x[:-1](从第一个元素开始,到倒数第二个元素结束)和x[1:](从第二个元素开始,一直到结尾),然后查找第一个小于第二个的切片,即捕获[False, True]模式,并最终使用ndarray.sum()np.count_nonzero()计算数量 -

(x[:-1] < x[1:]).sum()
np.count_nonzero(x[:-1] < x[1:])

另一种方法是查找第一个片段为False,第二个片段为True,这个想法再次是捕获[False, True]的模式。
(~x[:-1] & x[1:]).sum()
np.count_nonzero(~x[:-1] & x[1:])

1

我喜欢使用numpy中的"roll"方法解决这种问题... "roll"可以将数组向左旋转(-1,-2...)或向右旋转(1,2...)一定步长。

import numpy as np
np.roll(x,-1)

...这将会给出x,但向左移动一步:

array([ True,  True, False, False, False, False, False,  True, False, False], 
dtype=bool)

一个 False 后面跟着一个 True 可以表示为:
~x & np.roll(x,-1)

array([ True, False, False, False, False, False, False,  True, False, False], 
dtype=bool)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接