问题描述
我有两个布尔指标的布尔 Numpy 数组:
v v v
A = np.array([0,1,1],dtype=bool)
B = np.array([1,dtype=bool)
^ ^ ^
从左到右移动,我想隔离第一个真 A
指标,然后是下一个真 B
指标,然后是下一个真 A
指标,然后是下一个真指标B
指示符等以结束:
v v v
>>>> A_result = [0,1]
B_result = [0,1]
^ ^ ^
我有一种感觉,我可以创建一个 betweenAB
数组来指示 A==1
后跟 B==1
的所有位置:
v v v
betweenAB = [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