Numpy 快速无阵列布尔交

Numpy 快速无阵列布尔交,numpy,multidimensional-array,Numpy,Multidimensional Array,我有两个形状相同的3D布尔数组(比如(512512))。 我想检查一个数组的True区域是否完全包含在第二个数组中 现在我想到的最好的办法是: np.all((A * B) == A) 有没有更快的方法?不幸的是,这进入了一个内部循环,我无法进一步优化,因此我从中刮得越多越好。方法1:如果它们是布尔数组,和ing可能比乘法更好- ((A & B) == A).all() 方法#2:另一种方法是计算真值- np.count_nonzero(A & B) == np.count_

我有两个形状相同的3D布尔数组(比如
(512512)
)。 我想检查一个数组的
True
区域是否完全包含在第二个数组中

现在我想到的最好的办法是:

np.all((A * B) == A)
有没有更快的方法?不幸的是,这进入了一个内部循环,我无法进一步优化,因此我从中刮得越多越好。

方法1:如果它们是布尔数组,
和ing
可能比乘法更好-

((A & B) == A).all()
方法#2:另一种方法是计算真值-

np.count_nonzero(A & B) == np.count_nonzero(A)
运行时测试-

In [225]: A = np.random.rand(512,512,512)>0.5
     ...: B = np.random.rand(512,512,512)>0.5

In [226]: %timeit np.all((A * B) == A)
     ...: %timeit ((A & B) == A).all()
     ...: %timeit np.count_nonzero(A & B) == np.count_nonzero(A)
10 loops, best of 3: 170 ms per loop
10 loops, best of 3: 169 ms per loop
10 loops, best of 3: 57.7 ms per loop

方法#3:在numba水平上短路,主要是寻找是否存在任何
A
True,而对应的
B
不存在-

from numba import njit 

@njit
def numba_app(a, b):
    l = len(a)
    out = True
    for i in range(l):
        if a[i] & ~b[i]:
            out = False
            break
    return out

out = numba_app(A.ravel(), B.ravel())

短路方法的计时取决于数据。

酷,你确定进近#2真的会交叉吗?我的情况并非如此,但如果两个数组在不同位置具有相同数量的孔,即使它们不匹配,它仍然可以计算为true。@filippo如果它们在不同位置具有相同数量的孔,
A&B
的真值将小于
A
中的真值。这就是它起作用的原因。重要的是我在计算A&B的真实值。也许你弄糊涂了,你说得对!也许是时候休息一下喝杯咖啡了。。。非常感谢。