Numpy 快速无阵列布尔交
我有两个形状相同的3D布尔数组(比如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_
(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的真实值。也许你弄糊涂了,你说得对!也许是时候休息一下喝杯咖啡了。。。非常感谢。