Python 根据bool分解numpy数组

Python 根据bool分解numpy数组,python,arrays,numpy,split,Python,Arrays,Numpy,Split,我有一个类似的数组 a=np.array[4,9,3,1,6,4,7,4,2] 和一个大小相同的布尔数组(这是一个掩码),如 boo=np.array[真、真、假、假、真、真、真、假、真] (boo也可以以False作为第一个条目开始…) 现在我想将a拆分为具有两个条件的新数组: 一个新的子数组只包含True在boo 新的子数组总是在False之后开始,在False之前结束因此结果将是[[4,9],[6,4,7],[2] 我的想法是: 我知道我可以用它作为基础在这种情况下,它将是b=np.s

我有一个类似的数组

a=np.array[4,9,3,1,6,4,7,4,2]

和一个大小相同的布尔数组(这是一个掩码),如

boo=np.array[真、真、假、假、真、真、真、假、真]

boo
也可以以
False
作为第一个条目开始…)

现在我想将
a
拆分为具有两个条件的新数组:

  • 一个新的子数组只包含
    True
    boo
  • 新的子数组总是在
    False
    之后开始,在
    False
    之前结束
    因此结果将是
    [[4,9],[6,4,7],[2]
我的想法是:
我知道我可以用它作为基础
在这种情况下,它将是
b=np.split(a,[2,4,7,8]
,然后我只从
b
中取第二个元素,从第一个元素开始,因为我在
boo
中的第一个元素是
True

所以我的问题是:如何获得数组
[2,4,7,8]


(使用python循环不是一个选项,因为它太慢了。)

也许这已经足够快了:

d = np.nonzero(boo != np.roll(boo, 1))[0]
if d[0] == 0:
    d = d[1:]
b = np.split(a, d)
b = b[0::2] if boo[0] else b[1::2]

找到了一种更简单、更快的方法:

indices = np.nonzero(boo[1:] != boo[:-1])[0] + 1
b = np.split(a, indices)
b = b[0::2] if boo[0] else b[1::2]
比较切片的速度至少是
np.roll()加上if语句的两倍。
另外,
np.flatnonzero(…)
看起来比
np.nonzero(…)[0]
好,但速度稍慢