根据布尔分割numpy数组

Ger*_*ri 1 python arrays split numpy

我有一个像

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

和一个相同大小的布尔数组(所以这是一个面具)

boo = np.array[ True, True, False, False, True, True, True, False, True]

boo也可以从False第一个条目开始...)

现在,我想a用2个条件拆分为新数组:

  • 一个新的子数组仅包含Truein中的值boo
  • 一个新的子数组总是在a之后开始,在a False之前结束False
    所以结果是[[4, 9], [6, 4, 7], [2]]

我的想法是:
我知道我可以np.split作为基础。
在这种情况下,b = np.split(a, [2, 4, 7, 8]我将只从第二个b开始,而从第一个开始,因为我的第一个元素booTrue

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

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

Nor*_*man 5

也许这足够快:

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]
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

切片的比较速度至少是np.roll()加上if语句的两倍。
而且,np.flatnonzero(...)看起来会比更好,np.nonzero(...)[0]但会稍微慢一些。