어떤 변수의 값을 일정 범위 내로 제한하는 함수는 종종 쓰인다.
많이 사용하는 방법으로는 파이썬 내장함수인 min, max 가 있고, numpy 의 np.clip 을 사용하는 방법이 있다.
먼저...
NumPy의 np.clip 함수는
배열의 값이 지정한 최소값과 최대값을 벗어나지 않도록 잘라주는 함수
즉,
- 최소값보다 작으면 최소값으로
- 최대값보다 크면 최대값으로
- 그 사이 값은 그대로 유지
해주는 함수이다.
사용하는 것도 간단한데,
numpy.clip(a, a_min, a_max)
- a: 대상 배열
- a_min: 최소값
- a_max: 최대값
→ a의 값들을 a_min~a_max 범위로 제한한 결과 배열 반환
자, 실제 사용예제를 보자.
import numpy as np
# 원본 배열
arr = np.array([-5, 0, 3, 7, 10, 15])
# -1 ~ 10 사이로 값 제한
clipped_arr = np.clip(arr, -1, 10)
print("원본 배열:", arr)
print("clip 결과:", clipped_arr)
실행해보면 아래처럼 나온다.
요약해보면
- 배열의 값 범위를 제한하는 함수
- np.clip(a, min, max)
- min 보다 작으면 min, max 보다 크면 max
- 데이터 후처리, 속도/가속도 제한, 그래프 시각화 시 안전범위 제한 등에 활용
자.. 그런데 np.clip 말고도 python 기본함수로 제공하는 min(), max()를 이용해서도 동일한 기능을 구현할 수 있다.
이것 역시 그리 어렵지도 않다.
그러면 동일한 기능을 하는 두 방법 (np.clip vs. min,max) 중 어느 것이 빠를까?
한번 성능을 비교해보자.
결론부터 간략히 말하면:
- 단일 값 min/max → min, max 내장함수가 빠름
- 배열 전체를 min/max 제한 → np.clip이 훨씬 빠르고, 특히 큰 배열에서 NumPy 벡터 연산의 성능 이점이 큼
실제로 그런지 한번 예제를 만들어서 눈으로 확인해보자.
대상:
- 100만 개 난수 배열
- 각각의 값을
- np.clip으로 제한
- min/max 내장함수로 반복문 돌며 제한
시간 측정은 time 모듈로 한다.
import numpy as np
import time
# 100만 개 난수 배열 생성
arr = np.random.uniform(-10, 20, size=1_000_000)
min_val, max_val = 0.0, 10.0
# np.clip 성능 측정
start_time = time.time()
clipped_np = np.clip(arr, min_val, max_val)
np_time = time.time() - start_time
print(f"np.clip 소요 시간: {np_time:.6f}초")
# 내장 min/max로 반복문 성능 측정
start_time = time.time()
clipped_py = np.array([min(max(x, min_val), max_val) for x in arr])
py_time = time.time() - start_time
print(f"내장 min/max + for문 소요 시간: {py_time:.6f}초")
# 결과 비교
print(f"속도 차이 배율: {py_time / np_time:.1f}배")
실행해보면...
흠... 역시 배열에 대한 연산은 np.clip 이 훨씬 빠르다고 나온다.
그럼 혹시, 혹시라도... 변수 하나에 대한 속도차이는 어떻게 될 까?
변수 하나에 대해서 속도측정하는 예제를 만들어보자.
일단 단일 값일 때는...
- 단일 값일 때
np.clip은 사실 NumPy 함수 호출 오버헤드가 있어서 느릴 가능성이 높음 - min(max(x, min_val), max_val) 이 훨씬 가벼운 파이썬 연산
직접 측정해보자.
import numpy as np
import time
x = 7.5
min_val, max_val = 0.0, 10.0
# np.clip 성능 측정 (1000만번 반복)
start_time = time.time()
for _ in range(10_000_000):
np.clip(x, min_val, max_val)
np_time = time.time() - start_time
print(f"np.clip 소요 시간: {np_time:.6f}초")
# min/max 내장함수 성능 측정 (1000만번 반복)
start_time = time.time()
for _ in range(10_000_000):
min(max(x, min_val), max_val)
py_time = time.time() - start_time
print(f"내장 min/max 소요 시간: {py_time:.6f}초")
# 속도 차이 배율
print(f"속도 차이 배율: {np_time / py_time:.1f}배")
실행해보면 아래와 같은 결과가 나온다.
물론 단일변수에 대해서는 np.clip을 쓰나 내장함수 min/max를 쓰나 절대적인 시간차이는 크지 않다.
그러나 배열에 대해서는 성능차이가 좀 있으니 기억했다가 필요할 때 쓰면 되겠다.
그럼 이만~
'Python' 카테고리의 다른 글
Dear Imgui 파이썬 라이브러리(imgui_bundle) (1) | 2025.06.04 |
---|---|
파이썬 SharedMemory 사용법 (mp.Value 와의 차이) (0) | 2025.06.03 |
파이썬 데이터 압축 전송 (0) | 2025.05.24 |
파이썬 버전별 특징 (최근 버전이 좋다) (1) | 2025.05.16 |
ImGUI vs PySide6 (0) | 2025.05.14 |