2014-10-08 4 views
5

Numpy 배열에 조각 단위 함수를 적용하는 효율적인 (속도) 방법은 무엇입니까?Numpy 배열의 조각 별 기능

For (1) : x<=2 f(x) = 2*x + x^2 
    (2) : x>2 f(x) = -(x^2 + 2) 

가 여기에 내가 무슨 짓을했는지처럼

는 말, 예를 들어, 낱낱 기능은 다음과 같습니다.

data = np.random.random_integers(5, size=(5,6)) 
print data 
np.piecewise(data, [data <= 2, data > 2], 
      [lambda x: 2*x + pow(2, x), 
       lambda x: -(pow(x, 2) + 2)]) 

data = 
[[4 2 1 1 5 3] 
[4 3 3 5 4 5] 
[3 2 4 2 5 3] 
[2 5 4 3 1 4] 
[5 3 3 5 5 5]] 
output = 
array([[-18, 8, 4, 4, -27, -11], 
     [-18, -11, -11, -27, -18, -27], 
     [-11, 8, -18, 8, -27, -11], 
     [ 8, -27, -18, -11, 4, -18], 
     [-27, -11, -11, -27, -27, -27]]) 

작은 배열, 큰 배열, 많은 함수 등을 처리하는 효율적인 방법이 있습니까? 내 관심사는 사용되는 람다 함수입니다. 이것이 Numpy에 최적화되어 있는지 확실하지 않습니다.

답변

3

이 경우 람다에 대해 신경 쓰지 않아도됩니다. Numpy 최적화는 함수가 여러 값을 일괄 적으로 평가하도록함으로써 호출 오버 헤드를 줄이는 것입니다. np.piecewise에 대한 각 호출에서 funclist (함수 부분)의 각 함수는 정확히 한 번 호출되며 적절한 조건이 참인 모든 값으로 구성된 numpy 배열로 호출됩니다. 따라서, 이러한 람다는 numpy 최적화 된 방식으로 호출됩니다.

유사 항목은 np.select (정확히 두 부분은 np.where)입니다. 호출 오버 헤드는 동일한 방법으로 벡터화 된 것과 동일하지만 모든 데이터 요소에 대해 모든 함수를 평가합니다. 따라서 기능이 비싸면 특히 np.piecewise보다 느립니다. 어떤 경우에는 더 편리합니다 (람다 없음). 그리고 개념을 여러 변수로 쉽게 확장 할 수 있습니다.

+0

좋은 답변입니다. 'np.select()'또는'np.where()'를 사용하는 또 다른 장점은 계산을 할 때 전체 배열에 접근 할 수 있다는 것입니다. 함수가 입력의 다른 값 (예 : 각 점의 인접 값)에 따라 다르면이 방법이 유용합니다. 그러나 OP의 경우에는 문제가되지 않으며'np.piecewise()'가 좋습니다. –