假设我们有一个布尔数组x=np.array([True, True, False, True, False])
。有两个连续的True
组。我想要的是创建一个布尔数组l
的列表,其中l
中的每个数组只包含一组连续的True
。例如,x
应该与由下式定义的y
相同:
y = np.zeros_like(x)
for e in l:
y = y|e
到目前为止,我唯一成功的尝试是通过https://stackoverflow.com/a/7353335/4755229使用consecutive
函数
def consecutive_bools(bool_input):
consecutive_idx = consecutive(np.argwhere(bool_input).flatten())
ret = [np.zeros_like(bool_input) for i in range(len(consecutive_idx))]
for i, idx in enumerate(consecutive_idx):
ret[i][idx] = True
return ret
这似乎过于复杂了。有没有更好的(简洁,可能更快)的方法来做到这一点?
2条答案
按热度按时间mqkwyuun1#
考虑以下情况:
这里的想法是idx的元素是从True到False的任何切换的索引,反之亦然。由于
True
正好有2个连续的组,因此idx正好有4个元素。对于任意数量的连续组:
zengzsys2#
一个有趣的方法是构造每个段的开始和停止,然后通过
np.arange(x.size)
构造一个数组。比较它和所有开始与>=
,并比较它和所有停止与<
。两个结果的逻辑与产生所需的输出:这种方法在一些小阵列上工作良好,但其时间复杂度较高。对于大型数组,您可以简单地迭代start和stop来赋值:
简单基准: