부록 A. 프로그래밍기초 A-2. Numpy,,, Sympy 소개 한림대학교전자공학과
배울내용 Sympy 를이용한부호적계산 Numpy를이용한행렬연산 를이용한그래프그리기 를이용한신호해석 을이용한선형대수풀이 한림대학교 제 3 강 Numpy,,, Sympy 소개 2
의배열 Sympy 를이용한부호적계산 에서 1 차원벡터는다음과같이리스트변수로표현할수도있다. 리스트변수를이용한연산은리스트와리스트의덧셈과리스트와숫자의곱셈이정의되어있으나, 연산결과는공학분야에서사용하는벡터의연산과는다른결과가나온다. >>> a = [1, 3, 5, 3, 15] >>> 2*a [1, 3, 5, 3, 15, 1, 3, 5, 3, 15] >>> a+a [1, 3, 5, 3, 15, 1, 3, 5, 3, 15] >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 3
의배열 Sympy 를이용한부호적계산 의리스트는숫자뿐만아니라다양한데이터형을수용한다. 반면에내장 array 클래스는균일한숫자데이터형만을다룰수있다. >>> import array >>> a=array.array('i',[1,2,3]) >>> b=array.array('i',[4,5,6]) >>> a array('i', [1, 2, 3]) // 'i' 는정수형데이터를의미 >>> b array('i', [4, 5, 6]) >>> a+b array('i', [1, 2, 3, 4, 5, 6]) >>> 내장 array 객체에사칙연산을적용한결과도리스트형과같기때문에벡터나행렬을처리하기에적합하지않다. 한림대학교 제 3 강 Numpy,,, Sympy 소개 4
Numpy 의배열 Sympy 를이용한부호적계산 Numpy 는과학연산을위해서설계된다차원배열 (multidimensional array) 처리를위한 확장패키지이다. 숫자연산을할때리스트형이나내장 array 클래스의객체를사용하는 것보다 Numpy 패키지를사용하면더효율적이고편리하게연산을수행할 수있다. 1. import numpy numpy 모듈의함수나변수를사용할때는 numpy. 함수또는 numpy. 변수형식을사용한다. 2. import numpy as newname numpy를불러들여새로운이름인 newname으로사용한다. 즉, newname. 함수또는 newname. 변수형식을사용한다. 3. from numpy import * Numpy 모듈에있는모든객체를불러들여서현재에이름공간과합치는방법이므로모듈이름없이함수와변수를바로사용한다. Numpy 모듈의일부객체만사용할때는 대신에객체이름만쓸수도있다. 한림대학교 제 3 강 Numpy,,, Sympy 소개 5
Numpy 의배열생성 Sympy 를이용한부호적계산 원소가 4 개인 1 차원배열 a와원소가 10 개인 2 차원배열 b를만드는예제 >>> import numpy as np >>> a = numpy.array([0, 1, 2, 3]) >>> a array([0, 1, 2, 3]) >>> b = np.arange(10).reshape(2,5) >>> b array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> b.shape (2, 5) >>> b.ndim 2 >>> b.size 10 >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 6
Numpy 의배열 Sympy 를이용한부호적계산 array( ) 는리스트를 numpy의배열로변환하는함수이다 arange( ) 는주어진구간에서균일한간격의숫자를만드는함수이다. 앞예에서 numpy.arange(10) 은 0부터 9까지 1 간격의숫자를만드는함수이다. NumPy의주요객체는동일한데이터형을갖는원소들로구성된다차원배열이다. 각원소의인덱스는음이아닌정수의튜플로표시된다. >>> b[(1,2)] 7 >>> b[1,2] 7 >>> Numpy 에서차원은축 (axis) 이라고부르고, 축의개수를 rank 라고부른다. 한림대학교 제 3 강 Numpy,,, Sympy 소개 7
Numpy 의배열연산 Sympy 를이용한부호적계산 Numpy를이용한행렬연산을살펴보자. 예를들어, 다음과같은 2 3 행렬 A, B를생각해보자. [ ] [ ] A = 1 2 3 1 3 5, B = 3 2 5 1 4 2 두행렬의덧셈과뺄셈은각각다음과같다. [ ] [ ] A + B = 1 1 2 + 3 3 + 5 0 5 8 = 3 + 1 2 + 4 5 + 2 4 6 7, [ ] [ ] A B = 1 ( 1) 2 3 3 5 2 1 2 = 3 1 2 4 5 2 2 2 3. 한림대학교 제 3 강 Numpy,,, Sympy 소개 8
Numpy 의배열에대한원소끼리의연산 Sympy 를이용한부호적계산 에서는크기가같은배열에대해서 +,,, / 등의산술연산을수행할 수있다. >>> a = np.array([1, 2, 3, 3, 2, 5]).reshape(2,3) >>> b = np.array([[-1,3,5],[1,4,2]]) >>> a+b array([[0, 5, 8], >>> a-b [4, 6, 7]]) array([[ 2, -1, -2], >>> a*b [ 2, -2, 3]]) array([[-1, 6, 15], >>> a/b [ 3, 8, 10]]) array([[-1, 0, 0], [ 3, 0, 2]]) 한림대학교>>> 제 3 강 Numpy,,, Sympy 소개 9
Numpy 의배열에대한원소끼리의연산 Sympy 를이용한부호적계산 4칙연산외에도다음과같이다양한연산을 numpy의다차원배열에적용할수 있다. >>> a**2 array([[ 1, 4, 9], [ 9, 4, 25]]) >>> np.sqrt(a) array([[ 1., 1.41421356, 1.73205081], [ 1.73205081, 1.41421356, 2.23606798]]) >>> np.sqrt(b) main :1: RuntimeWarning: invalid value encountered in sqrt array([[ nan, 1.73205081, 2.23606798], [ 1., 2., 1.41421356]]) >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 10
Numpy 의배열을이용한행렬곱셈 Sympy 를이용한부호적계산 AB T = = = A T B = = [ [ [ 1 2 3 3 2 5 ] 1 1 3 4 5 2 1 ( 1) + 2 3 + 3 5 1 1 + 2 4 + 3 2 3 ( 1) + 2 3 + 5 5 3 1 + 2 4 + 5 2 20 15 28 21 1 3 2 2 3 5 ], [ 1 3 5 1 4 2 1 ( 1) + 3 1 1 3 + 3 4 1 5 + 3 2 2 ( 1) + 2 1 2 3 + 2 4 2 5 + 2 2 3 ( 1) + 5 1 3 3 + 5 4 3 5 + 5 2 ] ] (8.1) (8.2) 한림대학교 제 3 강 Numpy,,, Sympy 소개 11
Numpy 의배열을이용한행렬곱셈 Sympy 를이용한부호적계산 이두연산을 으로는다음과같이계산할수있다. >>> np.dot(a, b.transpose()) array([[20, 15], [28, 21]]) >>> np.dot(a.t, b) array([[ 2, 15, 11], [ 0, 14, 14], [ 2, 29, 25]]) >>> transpose() 함수는행렬의전치행렬을만드는함수이고, dot() 함수는행렬의내적을계산하는함수이다. a.transpose() 대신에 a.t라고쓸수도있다. 한림대학교 제 3 강 Numpy,,, Sympy 소개 12
모듈 Sympy 를이용한부호적계산 의패키지가운데에 는데이터를시각화할때필화요한다양한함수를지원하는패키지이다. 는기본적으로 Matlab의그래프관련함수들과매우유사하다. plot() 함수를사용하는가장기본적인사용형식은다음과같다. plot(x, y) # plot x and y using default line style # and color plot(x, y, 'bo')# plot x and y using blue circle markers plot(y) # plot y using x as index array 0..N-1 plot(y, 'r+') # ditto, but with red plusses stem() 함수의사용형식은다음과같다. stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-') 한림대학교 제 3 강 Numpy,,, Sympy 소개 13
: 샘플의개수에따른그래프차이 Sympy 를이용한부호적계산. 예제 (A.2). 폐구간 [0, 3π] 에서 x(t) = sin(t) 함수의그래프를그리시오. 단, 해당구간을 균등한간격으로샘플을취한후 plot() 함수를사용하여그래프를그리시오.. 단, 샘플의개수는 11, 21, 31 개 >>> from matplotlib.pylab import * >>> from numpy import * >>> t =linspace(0, 3*pi, 11) # 11 -> 21, 31 >>> x = sin(t) >>> title("example of plot(t,x): 11-points") <matplotlib.text.text object at 0x02A7F110> >>> plot(t,x) <Container object of 3 artists> >>> show() 한림대학교 제 3 강 Numpy,,, Sympy 소개 14
: 샘플의개수에따른그래프차이 Sympy 를이용한부호적계산 이예제에서 11 을 21 과 31 로바꾸어샐행하면서얻은 3 개의그래프는다음과 같다. 1.0 0.5 0.0 0.5 Example of plot(t,x): 11-points 1.0 0 2 4 6 8 10 Example of plot(t,x): 21-points 1.0 0.5 0.0 0.5 1.0 0 2 4 6 8 10 Example of plot(t,x): 31-points 1.0 0.5 0.0 0.5 1.0 0 2 4 6 8 10 한림대학교 제 3 강 Numpy,,, Sympy 소개 15
: 정현파신호그래프그리기 Sympy 를이용한부호적계산. 예제 (A.3). 폐구간 [0, 3π] 에서 x(t) = sin(t) 를균등한간격으로 21 개의샘플을취한이산. 신호의그래프를그리시오. >>> t =linspace(0, 3*pi, 21) >>> x = sin(t) >>> title("example of stem(t,x): 21-points") <matplotlib.text.text object at 0x02B20F50> >>> stem(t,x) <Container object of 3 artists> >>> show() 한림대학교 제 3 강 Numpy,,, Sympy 소개 16
: 정현파신호그래프그리기 Sympy 를이용한부호적계산 이프로그램을실행하면다음그래프를얻을수있다. 1.0 0.5 0.0 0.5 Example of stem(t,x): 21-points 1.0 0 2 4 6 8 10 한림대학교 제 3 강 Numpy,,, Sympy 소개 17
개요 Sympy 를이용한부호적계산 는수학, 과학, 공학분야에서사용할수있는다양한패키지를제공한다. 특수함수 (scipy.special) 신호처리 (scipy.signal) 영상처리 (scipy.ndimage) 푸리에변환 (scipy.fftpack) 최적화 (scipy.optimize) 수치적적분 (scipy.integrate) 선형대수 (scipy.linalg) 입출력 (scipy.io) 통계 (scipy.stats) 고속실행 (scipy.weave) 클러스터링알고리듬 (scipy.cluster) 희소행렬 (sparse matrices) (scipy.sparse) 보간 (scipy.interpolate) 기타 (e.g. scipy.odr, scipy.maxentropy) 이가운데신호와시스템분야에서가장많이사용되는패키지는 scipy.signal, scipy.fftpack, scipy.linalg 등이다. 한림대학교 제 3 강 Numpy,,, Sympy 소개 18
scipy.linalg 모듈 Sympy 를이용한부호적계산 ATLAS (Automatically Tuned Linear Algebra Software), LAPACK (Linear Algebra PACKage), 그리고 BLAS (Basic Linear Algebra Subroutines) 를 에서사용할수있도록만든 scipy.linalg.eig(): 정방행렬의고윳값과고유벡터를구하는함수 scipy.linalg.inv(): 정방행렬의역행렬을구하는함수 >>> import numpy as np >>> import scipy.linalg as LA >>> A = np.array([[1,2],[3,4]]) >>> B = LA.inv(A) >>> B array([[-2., 1. ], [ 1.5, -0.5]]) >>> np.dot(a,b) array([[ 1.00000000e+00, 0.00000000e+00], [ 8.88178420e-16, 1.00000000e+00]]) >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 19
scipy.signal.ltisys 모듈 Sympy 를이용한부호적계산 scipy.signal.ltisys 모듈은선형시불변시스템을해석하는데필요한 함수를제공한다. 전달함수가다음과같이주어지는연속시간선형시불변시스템이있다고 가정하자. H(s) = 1 s 2 + 3s + 4. (8.3) 이시스템의임펄스응답고단위계단응답의그래프를그리는스크립트를 아래와같이 Spyder 의콘솔창에다음과같이입력해보자. >>> import numpy as np >>> import scipy.signal.ltisys as ltisys >>> b = [1] >>> a = [1,3,4] >>> system = ltisys.lti(b,a) >>> t, h = system.impulse() >>> t, s = system.step() >>> plot(t,h,t,s) 한림대학교 >>> plt.plot(t,h,t,s) 제 3 강 Numpy,,, Sympy 소개 20
scipy.signal.ltisys 모듈 Sympy 를이용한부호적계산 1 그림 A.4 전달함수가 H(s) = 인선형시불변시스템의임펄스 s 2 + 3s + 4 응답과계단응답. 한림대학교 제 3 강 Numpy,,, Sympy 소개 21
수치적계산과 Sympy 를이용한부호계산의차이 Sympy 를이용한부호적계산 >>> import math as m >>> a = m.sqrt(4) >>> a 2.0 >>> m.sqrt(12) 3.4641016151377544 >>> m.sqrt(12) * a 5.999999999999999 >>> >>> import sympy >>> b = sympy.sqrt(4) >>> b 2 >>> sympy.sqrt(12) 2*sqrt(3) >>> sympy.sqrt(12) * b 6 >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 22
Sympy 변수 Sympy 를이용한부호적계산 어느변수에값을지정하기전에별도의선언과정이필요하지않다 >>> b = sympy.sqrt(4) SymPy 에서는 symbols() 이라는메쏘드를이용해서변수를정의한다. >>> x = sympy.symbols('x') >>> y = sympy.symbols('y') >>> x x >>> y y >>> c = x + y >>> c x + y >>> (c**3).expand() x**3 + 3*x**2*y + 3*x*y**2 + y**3 >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 23
Sympy 변수 Sympy 를이용한부호적계산 일반변수와 Sympy 의심볼의이름을같게사용하는것이일반적이지만다음과 같이서로다른이름을사용해도된다. >>> a = sympy.symbols('x') >>> b = sympy.symbols('y') >>> a x >>> b y >>> c = a + b >>> c x + y >>> d = (c**4).expand() >>> d x**4 + 4*x**3*y + 6*x**2*y**2 + 4*x*y**3 + y**4 >>> d.factor() (x + y)**4 한림대학교>>> 제 3 강 Numpy,,, Sympy 소개 24
Sympy 를이용한미적분계산 Sympy 를이용한부호적계산 Sympy 모듈에있는미분함수는 diff() 이고적분함수는 integrate() 이다. >>> from sympy import * >>> x = symbols('x') >>> expr = 2*x + sin(3*x) -exp(-3*x) >>> expr.diff() -3*x 3*cos(3*x) + 2 + 3*e >>> expr.integrate() -3*x 2 cos(3*x) e x - -------- + ----- 3 3 >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 25
Sympy 를이용한정적분계산 Sympy 를이용한부호적계산 정적분을구할때는다음예와같이적분변수와구간을함께명시하면된다. 다음스크립트는 π sin(x)dx를구하는예이다. 0 >>> from sympy import * >>> x = symbols('x') >>> integrate(sin(x), (x, 0, pi)) 2 >>> 한림대학교 제 3 강 Numpy,,, Sympy 소개 26
기타기능 Sympy 를이용한부호적계산 혹시 π, 2, e 등과같은무리수들의근사값에대해서궁금했던적이있다면다음스크립트가궁금증에대한답을줄수있을것이다. evalf() 메쏘드는수식의값을계산한결과를되돌려준다. >>> from sympy import * >>> pi.evalf() 3.14159265358979 >>> pi.evalf(20) 3.1415926535897932385 >>> pi.evalf(100) 3.1415926535897932384626433832795028841971693993751058 20974944592307816406286208998628034825342117068 >>> x = sqrt(3) + 1 >>> x 1 + sqrt(3) >>> x.evalf() 2.73205080756888 한림대학교 제 3 강 Numpy,,, Sympy 소개 27
IPythn 에서 Sympy 를이용한수식표현 Sympy 를이용한부호적계산 그림 A. 5 I QT console 에서 L A TEX 을이용한수식출력기능을사용한 한림대학교 제예 3. 강 Numpy,,, Sympy 소개 28
Sympy 를이용한부호적계산 [1] Tutorial( http://docs.scipy.org/doc/scipy/reference/tutorial/) 공식문서. Numpy,,, I, Sympy, Pandas에관한내용을정리하여제공. [2] Scientific Lecture Notes ( http://scipy-lectures.github.io/) Euroscipy 2011 Tutorial 자료를지속적으로보완하고있는자료. [3] Sympy Documentation (http://docs.sympy.org/latest/index.html) Sympy의최신자료 한림대학교 제 3 강 Numpy,,, Sympy 소개 29