在numpy数组中找到一系列的Trues

时间:2015-04-24 16:59:32

标签: python arrays numpy boolean

有一种很好的方法可以在一个numpy布尔数组中找到一系列的Trues吗?如果我有一个像:

这样的数组
x = numpy.array([True,True,False,True,True,False,False])

我可以获得一系列索引,如:

starts = [0,3]
ends = [1,4]

或存储此信息的任何其他适当方式。我知道这可以通过一些复杂的while循环来完成,但我正在寻找一种更好的方法。

1 个答案:

答案 0 :(得分:7)

您可以使用Falses填充x(一个在开头,一个在结尾),然后使用np.diff。 A"差异" 1表示从False转换为True,-1表示从True转换为False。

约定是将范围的结尾表示为之后的指数。此示例符合约定(您可以轻松使用ends-1代替ends来获取问题中的数组):

x1 = np.hstack([ [False], x, [False] ])  # padding
d = np.diff(x1.astype(int))
starts = np.where(d == 1)[0]
ends = np.where(d == -1)[0]
starts, ends
=> (array([0, 3]), array([2, 5]))