Python/Numpy

[Numpy] 파이썬 배열 하한, 상한값 채우기 함수 : np.clip()

jimmy_AI 2021. 12. 29. 20:11
반응형

파이썬 넘파이 값 자르기 함수 : np.clip()

안녕하세요. 이번 시간에는 배열에서 값들을 하한~상한 값의 범위로

값을 자르는 함수인 np.clip 함수의 사용법에 관해서 살펴보겠습니다.

 

이 함수는 특히 비전 태스크에서 많이 사용되는데요.

어려워보이지만 케이스를 나누면 매우 간단하게 이해되는

대표적인 사용 예시들을 살펴보겠습니다.

 

일단 기본적인 np.clip 함수의 사용법은

np.clip(array, 하한값, 상한값) 으로 3개의 input이 들어갑니다.

 

함수의 원리는

하한값 이하의 값들은 하한값으로 모두 바뀌게 되고,

상한값 이상의 값들은 상한값으로 모두 바뀌는 것으로 이해해주시면 쉽습니다.

 

 

np.clip 함수 기본 예시 (하한값, 상한값 둘다 있는 경우)

함수의 이해를 돕기 위하여 가장 기본적인 상황을 살펴보겠습니다.

아래의 1차원 배열 a와 2차원 배열 b를 가지고 앞으로의 상황을 설명하겠습니다.

import numpy as np

a = np.arange(10)

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

 

하한값을 2, 상한값을 7로 설정한 경우 함수의 사용 방법과 결과는 다음과 같습니다.

np.clip(a, 2, 7)
# array([2, 2, 2, 3, 4, 5, 6, 7, 7, 7])

np.clip(b, 2, 7)
# 결과
array([[4, 5, 2],
       [2, 7, 3],
       [7, 6, 7]])
       
# 참고 : 이렇게 사용도 가능
a.clip(2, 7)
b.clip(2, 7)

2이하의 값은 2로, 7이상의 값은 7로 바뀐 상황을 살펴볼 수 있습니다.

a.clip(하한값, 상한값)의 형식으로도 사용이 가능함을 참고해주세요.

 

원리를 그림으로 간단히 표현하면 다음과 같습니다.

반응형

np.clip 함수 특수 케이스 (하한값 >= 상한값)

하한값이 상한값보다 큰 경우라고 하면 이상하게 들릴 수 있는데요.

하한값이 더 큰 경우로도 함수 적용이 가능합니다.

이 경우에는 상한값으로 배열 내 모든 값들이 통일되는 결과를 가져옵니다.

일단, 사용 예제를 먼저 보도록 하겠습니다.

np.clip(a, 5, 3)
# array([3, 3, 3, 3, 3, 3, 3, 3, 3, 3])

np.clip(b, 5, 3)
# 결과
array([[3, 3, 3],
       [3, 3, 3],
       [3, 3, 3]])

모든 값들이 3으로 통일된 것을 확인할 수 있습니다.

 

원리는 하한값보다 작은 값들은 하한값으로 먼저 바뀌게 되는데,

이후 상한값보다 큰 값들을 상한값으로 바꾸는 과정에서 하한값이

상한값보다 크기때문에, 모든 값들이 상한값보다 큰 상태로 들어오게 됩니다.

따라서, 모든 값들이 상한으로 설정한 값으로 바뀌는 것입니다.

원리를 간단히 그림으로 정리하면서 넘어가보겠습니다.

 

 

np.clip 함수 하한값, 상한값 중 한 쪽만 있는 경우

이 경우의 처리는 간단합니다.

설정하지 않을 방향의 input을 None으로 설정해주면 됩니다.

아래 예시 코드를 살펴보시면 이해가 쉬울 것으로 생각됩니다.

np.clip(a, None, 7)
# array([0, 1, 2, 3, 4, 5, 6, 7, 7, 7])

np.clip(a, 3, None)
# array([3, 3, 3, 3, 4, 5, 6, 7, 8, 9])

각각 상한값만 있는 경우와 하한값만 있는 경우를 나타내보았습니다.

 

 

np.clip 함수 위치마다 하한/상한값이 다른 경우

만일, 배열의 각 위치마다 하한/상한값을 다르게 설정하고 싶은 경우,

각 위치의 하한 혹은 상한값을 지정한 배열을 input으로 넣을 수 있습니다.

 

아래의 예시는 하한값을 위치마다 다르게 지정했으며,

각 행마다 하한값을 다르게 설정하고 싶은 경우라고 가정한 상황입니다.

np.clip(b, np.array([[5, 5, 5],
                    [4, 4, 4],
                    [7, 7, 7]]), 8)
# 결과
array([[5, 5, 5],
       [4, 8, 4],
       [7, 7, 8]])

그림으로 위의 상황을 표현하면 다음처럼 이해해볼 수 있습니다.

여기서 상한값은 8로 고정한 상태로 가정을 했었는데,

만일 상한값도 위치마다 다르게 지정하고 싶다면 마찬가지로 배열 형태로

input을 넣어주시면 됩니다.