Python/Numpy:根据与两个数组相关的条件减少两个布尔数组

Python/Numpy: Reduce two boolean arrays based on conditionals relating to both arrays

我有两个布尔指标的布尔 Numpy 数组:

                          v                          v              v
A =    np.array([0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], dtype=bool)
B =    np.array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1], dtype=bool)
                                         ^                 ^        ^

从左到右,我想隔离第一个真 A 指标,然后是下一个真 B 指标,然后是下一个真 A 指标,然后是下一个 true B 指标等,以:

                          v                          v              v
>>>> A_result = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
     B_result = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1]
                                         ^                 ^        ^

我觉得我可以创建一个 betweenAB 数组来指示 A==1 后跟 B==1 的所有位置:

                          v                          v              v
betweenAB =     [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1]
                                         ^                 ^        ^

然后获取每个 运行 的开始和结束索引,但在谈到 Numpy 时我仍然有点初学者,我不确定我该怎么做。

我正在寻找一种完全矢量化的方法,因为我的应用程序中有数千个这样的数组,每个数组都包含数千个元素。任何帮助将不胜感激。

使用 Numpy 几乎无法有效地完成此操作(如果没有循环可能无法有效地完成),但使用 Numba 的 JIT 可以轻松高效地完成。这主要是由于应用操作的顺序性质。

这是 Numba 中的一个例子:

import numpy as np
import numba as nb

nb.jit('UniTuple(bool[::1],2)(bool[::1],bool[::1])')
def compute(A, B):
    assert len(A) == len(B)
    n = len(A)
    i = 0
    resA = np.zeros(n, dtype=bool)
    resB = np.zeros(n, dtype=bool)
    while i < n:
        while i < n and A[i] == 0:
            resA[i] = 0
            i += 1
        if i < n:
            resA[i] = 1
            if B[i] == 1:
                resB[i] = 1
                i += 1
                continue
            i += 1
        while i < n and B[i] == 0:
            resB[i] = 0
            i += 1
        if i < n:
            resB[i] = 1
            i += 1
    return resA, resB