2013-05-16 4 views
4
In [3]: f1 = rand(100000) 
In [5]: f2 = rand(100000) 

# Obvious method: 
In [12]: timeit fmin = np.amin((f1, f2), axis=0); fmax = np.amax((f1, f2), axis=0) 
10 loops, best of 3: 59.2 ms per loop 

In [13]: timeit fmin, fmax = np.sort((f1, f2), axis=0) 
10 loops, best of 3: 30.8 ms per loop 

In [14]: timeit fmin = np.where(f2 < f1, f2, f1); fmax = np.where(f2 < f1, f1, f2) 
100 loops, best of 3: 5.73 ms per loop 


In [36]: f1 = rand(1000,100,100) 

In [37]: f2 = rand(1000,100,100) 

In [39]: timeit fmin = np.amin((f1, f2), axis=0); fmax = np.amax((f1, f2), axis=0) 
1 loops, best of 3: 6.13 s per loop 

In [40]: timeit fmin, fmax = np.sort((f1, f2), axis=0) 
1 loops, best of 3: 3.3 s per loop 

In [41]: timeit fmin = np.where(f2 < f1, f2, f1); fmax = np.where(f2 < f1, f1, f2) 
1 loops, best of 3: 617 ms per loop 

마찬가지로 두 진수를 모두 한 단계에서 where 명령을 수행하는 방법이 있습니까?최소 및 최대 배열 두 개를 더 빨리 분리 할 수 ​​있습니까?

aminwhere과 같은 방식으로 구현되는 이유는 무엇보다 빠른 속도일까요?

답변

5

numpy의 기본 요소를 사용하여 maximumminimum을 사용하십시오.이 값은 where보다 빠릅니다. numpy docs for maximum이 확인에 노트 :

등가가 (X1> X2, X1, X2)를 np.where하지만 빠르고 적절한 방송을 수행한다.

fmin = np.minimum(f1, f2); fmax = np.maximum(f1, f2) 

내 자신의 결과가이 상당히 빠른 것으로 보여 당신이 당신의 첫 번째 테스트에 대해 원하는 것

선은 무언가 같이 될 것입니다. minimummaximum은 두 개의 인수가 같은 모양 인 한 모든 n 차원 배열에서 작동합니다.

Using amax     3.506 
Using sort     1.830 
Using where     0.635 
Using numpy maximum, minimum 0.178 
+2

기다려, 뭐!? 나는 그것들이 어떤 이유로 amin과 amax에 대한 동의어라고 생각했다. 문서는 서로 링크하지 않습니다. 한숨. 그것은 실제로 훨씬 더 빠릅니다. – endolith