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]
好,但速度稍慢