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
我有两个布尔指标的布尔 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