微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。