파이썬 기초2
파이썬 기초 강좌 두번째.
# -*- coding:utf-8 -*-
# Python lecture 2
# keeHwan Nam, Dept. of physics, KAIST, 2013.
# scipy / numpy 사용하기
'''
물리학, 수학, 공학 등 이공계 전반에서 파이썬을 사용하는 사람들 수가 늘어나면서 이공계에서 사용하는 수학 함수들에 대한 요구가 늘어났고, 따라서 사람들은 그런 수학 함수를 파이썬 모듈로 만들어서 제공한다. 거의 대부분의 이공계용 모듈들이 공짜로 제공되며, 심지어 소스도 공개되어 있는 오픈소스로 제공된다.
이 사람들이 어떻게 구현했는지 알아보고 싶을 때, 직접 소스를 열어서 살펴볼 수도 있고, 만약 뭔가 개선할 부분이 있다면 직접 고쳐서 투고할 수도 있다. 물론 이런거 만드는 사람들이 고수들이라 워낙에 잘 만들어져 있기 때문에 내가 손댈만한 부분은 없지만, 가끔 뭔가 고쳐야 할 부분이 있을지도 모르지 않은가.
어쨌든, 그 안에 어떻게 구현되었는지는 모르더라도, 이런 모듈들을 필요할 때 가져다 쓰는 것은 중요한 일이다. 그래서 소개하는 모듈이 scipy와 numpy이다.
numpy는 수치해석을 파이썬으로 하기 위해 필요한 거의 모든 것이 들어 있는 패키지이다.
공식 홈페이지: http://www.numpy.org/
scipy는 이공계에서 쓰는 수많은 함수들이 많이 들어 있는 패키지이다.
공식 홈페이지: http://www.scipy.org/
어쨌거나 둘 다 필요하므로 둘 다 설치하도록 하자.
설치하다보면, 운영체제 버전, 특히 윈도우즈에서 설치하는 경우 32비트/64비트 문제와 파이썬2.7이냐 파이썬3.3이냐 매우 골치아프게 다가온다. 실제로 당신이 이 문제를 해결하려면 나도 잘 알 수 없는 삽질을 해야 하는데, 그 모든 삽질을 미리 해두신 성인이 계셔서 이 우주는 살만하다는 사실을 알 수 있다.
http://www.lfd.uci.edu/~gohlke/pythonlibs/
위의 홈페이지에서 필요한 패키지들을 받아서 설치하기 전에 크리스토프 골케 님에게 감사의 인사를 마음속으로 하도록 하자.
http://wiki.scipy.org/Tentative_NumPy_Tutorial
numpy와 scipy의 경우, 매우 설명이 잘 되어 있는 자습서(Tutorial)를 제공한다. 영어를 잘 몰라도, 거기에 나와 있는 예제들만 한번씩 다 실행시켜 보면 대충 뭐가 어떻게 돌아가는지 알 수 있을 것이다.
'''
import numpy as np
# numpy는 대체로 as np로 줄여서 불러온다.
# 어쨌거나 위와 같이 하면 np.으로 시작하는 함수들을 모두 사용할 수 있다. np.조차 사용하기 귀찮다면
from numpy import *
# 배웠듯이, 위와 같이 불러오도록 하자. 다만, 파이썬 내장함수와 numpy의 함수들 중 몇개가 이름이 겹치긴 한다. 혹시 그런 함수들을 구분해서 사용해야 하는 경우라면 주의하도록 하자.
'''
http://docs.scipy.org/doc/numpy/reference/
http://docs.scipy.org/doc/scipy/reference/
위의 주소에 들어가 보면, numpy와 scipy에서 제공하는 여러 기능들에 관한 설명이 적혀 있다.
쭉 살펴보다가, '이거다!' 싶으면 클릭해서 열어보고 그 안에 원하는 함수를 찾아서 사용하면 된다.
못들어본게 많을 순 있어도, 필요한게 없는 경우는 거의 없을 것이다.
'''
# 예를 들어, 금융을 하다 보면 만날 수 있다는 현재 가치에 관한 함수가 있다. fv()라고 한다.
print numpy.pv(12., 2., 1)
# 위와 같이 실행시키면 -0.082840236686390539 이라는 값을 얻을 수 있을 것이다.
# 그리고 numpy의 모든 함수는 다음과 같은 입력도 처리해 준다.
print numpy.pv([12.,3], [2.,4], [1,4])
# 앞에서는 숫자 한개씩 입력했지만, 이번엔 여러개의 리스트를 입력했다. 이렇게 되면, "알아서, 척척" 첫번째 값끼리 대입한 함수값, 두번째 값끼리 대입한 함수값을 출력해준다. 즉, 결과는 array([-0.08284024, -1.328125 ])이 된다.
# 아주 많이 사용되는 모듈 중, 고속 푸리에 변환(FFT) 모듈이 있을 것이다. 이 모듈의 경우, 아무 생각 없이 import numpy 라고 하면 안된다. 즉,
numpy.fft.fft(array[1,2,3,4])
# 위와 같이 실행시키면 안된다는 뜻이다.
# 이 모듈은 numpy가 아니라 numpy.fft를 불러와야 한다. 이것은 실제로 디렉토리를 찾아가 보면, fft는 덩어리가 크기 때문에 별도의 디렉토리에 나누어져 들어가 있다. 즉, numpy가 설치된 디렉토리 밑에 fft라는 디렉토리가 따로 있어서, 그 밑에 있는 파일들을 불러와야 한다는 뜻이다. 따라서 numpy라고만 하면 안된다.
import numpy.fft
import numpy.fft as npfft
# 잘 모르겠다면, fft같은 모듈들은 위와 같이(둘 중 하나로) 불러와서 써야 한다는 사실만 기억하면 된다.
# 이런 모듈들이 몇개(은근히 많이) 있는데, 위의 reference를 꼼꼼히 잘 읽어보면 어떻게 사용해야 하는지 알 수 있을 것이다.
# 이러한 내용은 scipy도 마찬가지이다.
import scipy
# scipy의 사용은 위와 같이 사용한다.
# 베셀 함수, 르장드르 함수 등 특별한 함수들은 scipy.special이라는 모듈에 별도로 저장되어 있다. 따라서 베셀 함수를 불러오고 싶다면,
import scipy.special
# 위와 같은 방식으로 모듈을 불러와야 한다.
# 그렇게 되면, 이제 0차 1종 베셀 함수를 다음과 같이 불러올 수 있다.
print scipy.special.j0(0.5)
# 그 외에, 아주 많은 함수들이 있지면 여기서 모두 소개하는 것은 scipy 사용설명서 번역과 같은 작업이므로 생략하도록 하겠다.