2012-04-21 3 views
2

numpy.select를 사용하여 값을 배열에 조건부로 할당하려고합니다. 그러나 선택의 사용은 DIV/0 오류가 발생할 수 있습니다 아니라 단지 관련 과제보다는 모든 가능한 과제, 예를 들어 계산이 필요합니다numpy.select를 사용하여 div/0 오류를 방지하십시오.

import numpy as np 
def testfunc(z): 
    conditionlist = [z < 0, z == 0, z > 0] 
    choicelist = [1/z, 0, 1 + z] 
    return np.select(conditionlist, choicelist) 

if __name__ == "__main__": 

    print testfunc(np.array([0])) 
이 코드는 DIV/0 오류와 함께 실패합니다

, 1/Z 있지만, 여기서 z = 0은 반환 된 배열에 실제로 할당 될 필요가 없습니다.

div/0 오류없이 조건부로 numpy 배열에 값을 할당 할 수 있습니까? 루프가 유일한 옵션입니까?

답변

4
np.select([z < 0, z == 0, z > 0], [1/(z + (z == 0)), 0, 1 + z]) 

z == 0은 부울 배열을 제공합니다. 이것을 z에 추가하면 np.select이 사용할 색인에 대해 z과 같은 0 요소가없는 배열이 제공됩니다.

+0

깔끔한 트릭. 이 접근법이나 루프가 더 효율적인지 알기 위해 어떤 일이 있습니까? 루프는 사용되지 않은 많은 계산을 피할 것입니다 ... – elhefe

+0

@elhefe : 저는 (게으르다) 확신 할 수 있도록 측정해야하지만, 내 직감은 루프가 ** 많이 느려질 것이라는 것입니다. –

1

numpy.seterr을 사용하면 0에서 0으로 나누기의 동작을 다른 것으로 변경할 수 있습니다.