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

2024-09-30 18:23:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个布尔指示器的布尔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)
                                         ^                 ^        ^

从左到右,我想分离第一个trueA指示符,然后是下一个trueB指示符,然后是下一个trueA指示符,然后是下一个trueB指示符,以此类推

                          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,我仍然是一个初学者,不知道如何才能做到这一点

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


Tags: numpynp数组result指数array跑步矢量化
1条回答
网友
1楼 · 发布于 2024-09-30 18:23:08

使用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

相关问题 更多 >