2016-12-26 1 views
21

목록에서 아웃 라이너를 바꾸고 싶습니다. 그러므로 나는 상한과 하한을 정의한다. 이제 upper_bound 위 및 lower_bound 아래의 모든 값이 바운드 값으로 바뀝니다. 내 접근 방식은 numpy 배열을 사용하여 두 단계로이 작업을 수행했습니다.목록 값을 상한 및 하한으로 바꾸는 Pythonic 방법 (클램핑, 클리핑, 임계 값)?

이제 성능 및 가독성을 향상시킬 수 있다고 생각되면 한 단계에서 이렇게 할 수 있을지 궁금합니다.

더 짧은 방법이 있나요?

import numpy as np 

lowerBound, upperBound = 3, 7 

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

arr[arr > upperBound] = upperBound 
arr[arr < lowerBound] = lowerBound 

# [3 3 3 3 4 5 6 7 7 7] 
print(arr) 
+1

컴파일 된'clip' 메소드가있는 것이 좋지만, 코드에 대해서는 아무 것도 없다. 그것은'numpy'를 완벽하게 사용하며, 경험있는 사용자에게는 읽기 쉽습니다. 그 개념을 도구 상자에 보관하십시오. 'clip' 모델에 맞지 않는 경우에 작동합니다. – hpaulj

+1

이 작업은 일반적으로 *** 클램핑 ***, *** 클리핑 *** 또는 *** 임계 값 ***이라고합니다. – smci

+2

'clip' 메서드를 사용해야하지만 속도보다 다른 이유가 있습니다. 당신의 코드는 우아하지만 배열이 커지면 문제가 될 수있는'arr> upperBound'를 가진 중간 배열을 생성합니다. 귀하의 코멘트에 –

답변

31

당신은 numpy.clip 사용할 수 있습니다

In [1]: import numpy as np 

In [2]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [3]: lowerBound, upperBound = 3, 7 

In [4]: np.clip(arr, lowerBound, upperBound, out=arr) 
Out[4]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7]) 

In [5]: arr 
Out[5]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7]) 
+0

안녕하세요 @arthur, 정확히 내가 뭘 찾고 있었는지 고마워요! 나는 어떻게 든 핵심 단어'클립'을 놓치고 직접 메서드를 찾지 못했습니다 ... – ppasler

+3

'클립'이 쓰여지는지 궁금합니다. 함수 호출로 감싸 이는 똑같은 일을 할 수 있습니다. – hpaulj

+0

@hpaulj 당신은 알아 냈습니까? – djechlin

13

를 대체 들어 numpy에 의존하지 않는, 당신은 항상

arr = [max(lower_bound, min(x, upper_bound)) for x in arr] 

을 할 수있는 당신은 그냥 상단을 설정하고 싶었다면 바인딩, 당신은 물론 arr = [min(x, upper_bound) for x in arr] 쓸 수 있습니다. 또는 유사하게 낮은 범위를 원한다면 대신 max을 사용하십시오.

여기서는 두 가지 작업을 모두 적용한 것입니다.

편집 :

배열의 요소 x을 감안할 때

(그리고 upper_bound 적어도 lower_bound 당신만큼 큰 것을 가정!), 당신은 하나를해야합니다 : 여기에 조금 더 깊이있는 설명입니다

I) x < lower_bound

II) x > upper_bound

III) 012 : 삼가지 경우.

(i)의 경우, max/min 표현은 처음에 max(lower_bound, x)으로 평가되며, lower_bound으로 해석됩니다.

(ii)의 경우, 표현은 먼저 max(lower_bound, upper_bound)이되고, upper_bound이됩니다.

(iii)의 경우 max(lower_bound, x)은 단지 x으로 해석됩니다.

세 가지 경우 모두 출력은 우리가 원하는 것입니다.

+1

그냥 내 불만 (투표 없음), 나는 최대/최소 조합을 볼 때 * 정말 * 힘들다고 생각하고 읽을 수없는 그들을 찾을 경향이 있습니다. – djechlin

+6

@djechlin 물론, 나는 그것에 동의하지 않습니다. 다른 한편,이 점에 대한 다른 대답은'numpy.clip'을 사용하는데, 어딘가에 나왔다면 즉시 읽을 수 없을 것입니다. 아마도 numpy 문서를 다시 확인하고 싶을 것입니다. 그것이 무엇인지 추측하고, 저자가 올바르게 이해했기를 바랍니다. – mathmandan

+0

이상한 것은 둥지입니다. 이것은 "클립 한 번"두 번 클립으로 구성된 매우 대칭적인 작업입니다. "클립 한 번 클립 한 다음 다시 클립으로 넣으십시오." – djechlin