アプローチ#1:彼らはブール配列の場合、AND-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:は基本的に対応するB
がされていないため、任意のA
真があるかどう探しnumbaレベルで短絡する - このShort-circuiting
と
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は実際に交差点を確認していますか?実際は私の場合ではありませんが、2つの配列の穴数が同じであれば、一致しない場合でも真と評価できます。 – filippo
@filippo異なる位置に同じ数の穴がある場合、 'A&B'は' A'のTrue値よりもTrue値が小さくなります。そういうわけで、それは機能します。重要なのは、私がA&BのTruesを数えていることです。たぶんあなたはそこで混乱しています。 – Divakar
ええ、そうですよ!それはおそらく休憩を取るとコーヒーを持っている時間です...ありがとう – filippo