2017-11-24 1 views
2

동일한 모양의 두 개의 3D 부울 배열이 있습니다 (예 : (512,512,512)). 한 배열의 True 영역이 두 번째 배열에 완전히 포함되어 있는지 확인하고 싶습니다.빠른 ndarray 부울 교차

는 지금 내가 가지고 올 것 중에 최고입니다 :이 작업을 수행하는 빠른 방법은

np.all((A * B) == A) 

있습니까? 불행히도 내부 루프 내부로 들어가서 더 이상 최적화 할 수 없으므로 더 많이 면도 할 수 있습니다.

답변

2

# 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()) 

타이밍 방법은 데이터에 따라 다릅니다.

+0

멋진데, 접근 # 2가 실제로 교차로입니까? 내 경우는 아니지만 두 배열의 위치가 다른 구멍의 수가 같으면 일치하지 않아도 사실로 평가할 수 있습니다. – filippo

+0

@filippo 서로 다른 위치에 같은 개수의 구멍이 있다면 'A & B'는'A '의 True 값보다 더 작은 True 값을가집니다. 그것이 작동하는 이유입니다. 중요한 것은 내가 A & B에 Trues를 세고 있다는 것입니다. 어쩌면 혼란스러워 할 수 있습니다. – Divakar

+0

어, 네가 맞아! 휴식을 취하고 커피를 마시는 시간은 아마도 ... 감사합니다. – filippo