有一种很好的方法可以在一个numpy布尔数组中找到一系列的Trues吗?如果我有一个像:
这样的数组x = numpy.array([True,True,False,True,True,False,False])
我可以获得一系列索引,如:
starts = [0,3]
ends = [1,4]
或存储此信息的任何其他适当方式。我知道这可以通过一些复杂的while循环来完成,但我正在寻找一种更好的方法。
答案 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]))