1. NumPy 소개
NumPy(Numerical Python)는 파이썬의 과학 컴퓨팅을 위한 핵심 라이브러리입니다. 대규모 다차원 배열과 행렬을 효율적으로 처리할 수 있는 도구를 제공하며, 이러한 배열에서 작동하는 다양한 수학 함수 라이브러리를 포함하고 있습니다. NumPy는 데이터 분석, 머신러닝, 이미지 처리 등 다양한 분야에서 필수적으로 사용되는 라이브러리입니다.
2. NumPy의 핵심 기능
2.1 다차원 배열(ndarray)
NumPy의 핵심은 다차원 배열 객체인 ndarray입니다. 이는 같은 타입의 항목들을 담는 컨테이너로, 효율적인 연산을 가능하게 합니다.
import numpy as np
# 1차원 배열 생성
arr1 = np.array([1, 2, 3, 4, 5])
# 2차원 배열 생성
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr1.shape) # (5,)
print(arr2.shape) # (2, 3)
2.2 브로드캐스팅(Broadcasting)
브로드캐스팅은 다른 형상의 배열 간 연산을 가능하게 하는 NumPy의 강력한 기능입니다.
a = np.array([1, 2, 3])
b = np.array([[1], [2], [3]])
print(a + b)
# [[2 3 4]
# [3 4 5]
# [4 5 6]]
2.3 인덱싱과 슬라이싱
NumPy는 다차원 배열에 대한 강력한 인덱싱과 슬라이싱 기능을 제공합니다.
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[1, 1]) # 5
print(arr[:, 1]) # [2 5 8]
print(arr[1:, 1:]) # [[5 6]
# [8 9]]
3. NumPy의 수학 함수
NumPy는 다양한 수학 함수를 제공합니다. 이들은 배열 전체에 대해 효율적으로 작동합니다.
3.1 기본 수학 함수
arr = np.array([1, 2, 3, 4])
print(np.sqrt(arr)) # [1. 1.41421356 1.73205081 2.]
print(np.exp(arr)) # [ 2.71828183 7.3890561 20.08553692 54.59815003]
print(np.log(arr)) # [0. 0.69314718 1.09861229 1.38629436]
3.2 통계 함수
arr = np.array([[1, 2], [3, 4]])
print(np.mean(arr)) # 2.5
print(np.std(arr)) # 1.118033988749895
print(np.max(arr)) # 4
4. 선형 대수학
NumPy는 선형 대수학 연산을 위한 다양한 함수를 제공합니다.
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.dot(A, B)) # 행렬 곱
# [[19 22]
# [43 50]]
print(np.linalg.inv(A)) # 역행렬
# [[-2. 1. ]
# [ 1.5 -0.5]]
print(np.linalg.eigvals(A)) # 고유값
# [-0.37228132 5.37228132]
5. 난수 생성
NumPy는 다양한 확률 분포에 따른 난수를 생성할 수 있습니다.
# 균일 분포
print(np.random.rand(3, 2))
# 정규 분포
print(np.random.randn(3, 2))
# 정수 난수
print(np.random.randint(0, 10, size=(3, 2)))
6. 성능 최적화
NumPy는 C로 구현되어 있어 매우 빠르지만, 몇 가지 최적화 기법을 통해 더 나은 성능을 얻을 수 있습니다.
6.1 벡터화
루프 대신 벡터화된 연산을 사용하면 성능이 크게 향상됩니다.
# 비효율적인 방법
def slow_sum(arr):
total = 0
for i in range(len(arr)):
total += arr[i]
return total
# 효율적인 방법
def fast_sum(arr):
return np.sum(arr)
6.2 메모리 레이아웃 최적화
연속된 메모리 접근은 캐시 효율성을 높입니다. NumPy의 C-contiguous 또는 F-contiguous 배열을 활용하세요.
# C-contiguous 배열 생성
arr_c = np.array([[1, 2, 3], [4, 5, 6]], order='C')
# F-contiguous 배열 생성
arr_f = np.array([[1, 2, 3], [4, 5, 6]], order='F')
7. NumPy의 고급 기능
7.1 구조화된 배열
NumPy는 복합 데이터 타입을 지원합니다.
dt = np.dtype([('name', 'S10'), ('age', int)])
arr = np.array([('Alice', 25), ('Bob', 30)], dtype=dt)
print(arr['name']) # [b'Alice' b'Bob']
7.2 메모리 뷰와 공유
NumPy는 데이터의 복사 없이 메모리를 공유할 수 있습니다.
a = np.arange(10)
b = a[::2] # b는 a의 데이터를 참조합니다
b[0] = 100
print(a) # [100 1 2 3 4 5 6 7 8 9]
8. NumPy와 다른 라이브러리의 통합
NumPy는 다른 과학 컴퓨팅 라이브러리와 잘 통합됩니다.
- SciPy: 과학 및 기술 컴퓨팅을 위한 추가 기능 제공
- Pandas: 데이터 분석을 위한 고수준 도구 제공
- Matplotlib: 데이터 시각화 기능 제공
- Scikit-learn: 머신러닝 알고리즘 제공
9. NumPy의 한계와 주의점
- 메모리 사용: 대규모 배열은 많은 메모리를 사용할 수 있습니다.
- 데이터 타입: 모든 원소가 같은 타입이어야 합니다.
- 병렬 처리: 기본적으로 단일 스레드에서 동작합니다. 병렬 처리를 위해서는 추가 설정이 필요합니다.
NumPy는 파이썬 과학 컴퓨팅의 핵심 라이브러리로, 효율적인 다차원 배열 처리와 수학적 연산을 제공합니다. 데이터 분석, 머신러닝, 신호 처리 등 다양한 분야에서 필수적으로 사용되며, 다른 과학 컴퓨팅 라이브러리의 기반이 되고 있습니다. NumPy의 기본 개념과 고급 기능을 잘 이해하고 활용한다면, 효율적이고 강력한 과학 컴퓨팅 애플리케이션을 개발할 수 있을 것입니다.