NumPy (Numerical Python)
NumPy는 Python에서 수치 연산과 과학 계산을 효율적으로 수행할 수 있게 해주는 **오픈소스 라이브러리**입니다. 특히 **다차원 배열(NumPy Array)**과 이를 기반으로 하는 다양한 연산 기능을 제공하여 데이터 처리와 분석에서 핵심적인 역할을 합니다.
NumPy의 주요 특징
- 다차원 배열 객체:
- NumPy의 핵심 데이터 구조는
ndarray로, 다양한 차원의 배열(1D, 2D, 3D 등)을 지원합니다. -
배열은 일반 Python 리스트보다 메모리 효율적이고 연산 속도가 빠릅니다.
-
벡터화 연산 (Vectorization):
- 반복문 없이 배열 전체에 대해 연산을 수행할 수 있어 코드가 간결하고 실행 속도가 빠릅니다.
-
예: 배열의 모든 요소에 2를 더하기, 요소별 곱셈 등.
-
브로드캐스팅:
- 크기가 다른 배열 간에도 연산이 가능하도록 자동으로 크기를 맞추는 기능.
-
예: (3,) 배열과 (3, 3) 배열 간 연산.
-
다양한 내장 함수:
- 배열 생성, 조작, 변환.
- 선형대수 연산(행렬 곱, 역행렬, 고유값 분해 등).
- 통계 연산(평균, 분산, 표준편차 등).
-
고속 푸리에 변환(FFT).
-
확장성:
- 다른 과학 및 데이터 분석 라이브러리(Pandas, SciPy, TensorFlow 등)의 기반으로 사용됩니다.
NumPy의 주요 구성 요소
- 배열 생성
-
배열을 생성하고 초기화하는 다양한 함수 제공.
import numpy as np # 1D 배열 생성 arr = np.array([1, 2, 3]) # 2D 배열 생성 arr2d = np.array([[1, 2, 3], [4, 5, 6]]) # 특정 값으로 채운 배열 zeros = np.zeros((2, 3)) # 2x3 배열, 0으로 초기화 ones = np.ones((3, 3)) # 3x3 배열, 1로 초기화 rand = np.random.rand(3, 2) # 3x2 배열, 랜덤 값 -
배열 연산
-
NumPy는 배열 요소별 연산을 지원합니다.
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 요소별 연산 c = a + b # [5, 7, 9] d = a * b # [4, 10, 18] e = a ** 2 # [1, 4, 9] -
인덱싱과 슬라이싱
-
NumPy 배열은 Python 리스트와 유사한 방식으로 요소에 접근하거나 슬라이싱 가능합니다.
arr = np.array([1, 2, 3, 4, 5]) print(arr[0]) # 첫 번째 요소: 1 print(arr[1:4]) # 슬라이싱: [2, 3, 4] -
배열 형태 변경
-
배열의 크기(shape)를 조정하거나 전치(transpose) 가능합니다.
arr = np.array([[1, 2], [3, 4], [5, 6]]) print(arr.shape) # (3, 2) reshaped = arr.reshape(2, 3) # (2, 3) 배열로 변환 print(reshaped) transposed = arr.T # 배열 전치 print(transposed) -
유용한 함수
a = np.array([1, 2, 3, 4, 5]) print(np.sum(a)) # 합계: 15 print(np.mean(a)) # 평균: 3.0 print(np.max(a)) # 최댓값: 5 print(np.min(a)) # 최솟값: 1 print(np.sqrt(a)) # 요소별 제곱근: [1., 1.41, 1.73, 2., 2.24]
NumPy의 장점
- 빠른 연산 속도:
-
NumPy는 내부적으로 C로 구현되어, 일반 Python 코드보다 훨씬 빠르게 수치 연산을 수행.
-
메모리 효율성:
-
Python 리스트에 비해 메모리 사용량이 적음.
-
다양한 데이터 처리 기능:
-
이미지, 오디오, 비디오 데이터를 포함한 다양한 데이터 포맷 처리 가능.
-
광범위한 응용 분야:
- 데이터 과학, 인공지능, 기계 학습, 물리학 시뮬레이션 등에서 사용.
NumPy와 다른 도구와의 연계
- Pandas:
- Pandas는 NumPy 기반으로 구축되었으며, 데이터 분석 및 처리에 특화.
- OpenCV:
- OpenCV 이미지는 NumPy 배열로 표현되어 이미지 처리에 활용.
- TensorFlow/PyTorch:
- 딥러닝 프레임워크에서도 NumPy 배열을 데이터 전처리에 사용.
실용 예제
1. 이미지 데이터 처리
OpenCV로 이미지를 로드하고 NumPy로 처리:
import cv2
import numpy as np
# 이미지 로드
img = cv2.imread('example.jpg')
# 이미지의 일부를 슬라이싱
cropped = img[50:200, 100:300]
# 밝기 조정 (모든 픽셀 값에 50 추가)
brightened = np.clip(img + 50, 0, 255)
cv2.imshow('Cropped', cropped)
cv2.imshow('Brightened', brightened)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 데이터 분석
NumPy를 이용한 통계 분석:
import numpy as np
data = np.random.randn(1000) # 1000개의 난수 생성
mean = np.mean(data)
std_dev = np.std(data)
print(f"평균: {mean}, 표준편차: {std_dev}")
NumPy는 간단한 수학 계산부터 복잡한 데이터 분석까지 다양한 작업을 지원하며, 데이터 과학과 머신러닝의 필수 도구로 널리 사용됩니다.