파이썬 SciPy: 라이브러리 & 함수 종합 튜토리얼
파이썬 SciPy: 라이브러리 & 함수 종합 튜토리얼
파이썬 SciPy
SciPy는 NumPy를 확장해 수학, 과학, 공학, 기술 문제 해결 도구를 제공하는 오픈소스 라이브러리입니다. NumPy 위에 구축된 SciPy는 데이터 조작과 시각화를 위한 광범위한 고수준 명령을 제공합니다.
서브 패키지
- scipy.io – MATLAB, NetCDF, CSV 등 다양한 포맷 파일 I/O
- scipy.special – 특수 수학 함수 (Bessel, Gamma 등)
- scipy.linalg – 선형 대수 루틴
- scipy.interpolate – 보간 기법
- scipy.optimize – 최적화와 커브 피팅
- scipy.stats – 통계 분포와 난수 생성
- scipy.integrate – 수치 적분
- scipy.fftpack – 고속 푸리에 변환
- scipy.signal – 신호 처리
- scipy.ndimage – 다차원 이미지 처리
이 튜토리얼 다룰 내용:
- SciPy 정의와 중요성
- NumPy와 SciPy 차이점
- 설치와 환경 설정
- 코드 예제와 주요 서브 패키지
- 실용 애플리케이션: 선형 대수, 푸리에 변환, 최적화, 이미지 처리, 수치 적분
왜 SciPy를 사용하는가?
- GNU Scientific Library와 MATLAB에 버금가는 포괄적 과학 도구 세트
- 사용하기 쉽고 빠르며 NumPy 배열과 완전 호환
- 학계와 산업계에서 널리 채택되어 탄탄한 지원과 커뮤니티 기여 보장
NumPy vs SciPy
NumPy
- C로 작성된 파이썬 고성능 수치 계산 핵심 라이브러리
- 배열 객체와 기본 연산(정렬, 형태 변경, 인덱싱) 제공
- 파이썬 모든 과학 라이브러리의 기반
SciPy
- NumPy 위에 구축되어 특수 알고리즘으로 확장
- 완전한 선형대수 스위트, 최적화, 통계 등 포함
- 고급 과학 워크플로에 필수
설치 & 환경 설정
pip나 시스템 패키지 매니저로 SciPy 설치:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
스크립트에서 SciPy와 NumPy 임포트:
from scipy import special
import numpy as np
scipy.io로 파일 I/O
MATLAB .mat 파일 쉽게 저장/로드:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
loaded = sio.loadmat('example.mat', struct_as_record=True)
print(loaded['ar'])
출력: array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]])
특수 함수 – scipy.special
자주 쓰이는 특수 함수 예:
- 세제곱근:
scipy.special.cbrt(x) → cbrt([27, 64]) # [3., 4.]
- 10x:
scipy.special.exp10(x) → exp10([1,10]) # [1.e+01 1.e+10]
- 조합:
scipy.special.comb(N, k, exact=False, repetition=True) → comb(5, 2) # 15.0
- 순열:
scipy.special.perm(N, k, exact=True) → perm(5, 2) # 20
- LogSumExp:
scipy.special.logsumexp(x)
- Bessel J:
scipy.special.jn(n, x)
선형 대수 – scipy.linalg
행렬식, 역행렬, 고윳값, 고유벡터 계산:
from scipy import linalg
import numpy as np
A = np.array([[4,5],[3,2]])
print(linalg.det(A)) # -7.0
print(linalg.inv(A)) # 역행렬
vals, vecs = linalg.eig(A)
print(vals)
print(vecs)
출력: -7.0 / 역행렬 / [9.+0.j -1.+0.j] / 고유벡터
이산 푸리에 변환 – scipy.fftpack
정현파 변환하고 스펙트럼 시각화:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Time (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
최적화 – scipy.optimize
BFGS로 스칼라 함수 최솟값 찾기, basin-hopping으로 전역 탐색:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('BFGS 결과:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('Basin-hopping 결과:', min_basin.x)
BFGS가 찾은 지역 최솟값과 basin-hopping으로 확인된 전역 최적값 출력.
Nelder-Mead 알고리즘
기울기 정보 없이 단순 무제약 최소화:
from scipy.optimize import minimize
def f(x):
return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('결과:', res.x, '함수값:', res.fun)
이미지 처리 – scipy.ndimage
이미지 조작: 표시, 뒤집기, 회전, 필터 적용.
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Flip Down')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotated 135°')
plt.show()
수치 적분 – scipy.integrate
자동 오차 추정이 포함된 단일/이중 적분:
from scipy import integrate
# 0에서 1까지 x^2 단일 적분
single = integrate.quad(lambda x: x**2, 0, 1)
print('단일 적분:', single)
# 삼각 영역에서 64*x*y 이중 적분
double = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('이중 적분:', double)
둘 다 튜플 반환: (값, 추정 오차).
요약
SciPy는 NumPy를 확장해 선형 대수, 최적화, 통계, 신호 처리, 이미지 조작을 포함한 완전한 과학 계산 스택을 제공합니다. 광범위한 서브 패키지와 탄탄한 커뮤니티 지원으로 연구자와 엔지니어에게 필수적입니다.
| 패키지명 | 설명 |
| scipy.io | MATLAB, CSV, NetCDF 등 파일 입출력 |
| scipy.special | 특수 수학 함수 (Bessel, Gamma 등) |
| scipy.linalg | 고급 선형대수 루틴 |
| scipy.interpolate | 보간 메서드 |
| scipy.optimize | 최적화와 커브 피팅 도구 |
| scipy.stats | 통계 분포 & 난수 생성 |
| scipy.integrate | 수치 적분 (quad, dblquad 등) |
| scipy.fftpack | 고속 푸리에 변환 |
| scipy.signal | 신호 처리 유틸리티 |
| scipy.ndimage | 다차원 이미지 처리 |