파이썬 라이브러리¶
참고 자료 : Scipy Lecture Notes
matplotlib 을 이용하여 그래프 그리기¶
맷플롯립 패키지를 불러오고, 그래프를 노트북 문서 안에 나타낼 수 있도록 설정한다
import matplotlib.pyplot as plt
%matplotlib inline
리스트 데이터를 그래프로 나타내기
x = [0,1,2,3]
y = [0,1,4,10]
plt.plot( x, y )
plt.show()
numpy 라이브러리¶
numpy 를 이용하여 함수를 그래프로 그리기¶
numpy 라이브러리를 불러온다.
import numpy as np
numpy 를 이용하여 $x$ 데이터에 대한 리스트를 만들고, $y= \cos \left( 2x \right)$ 를 그린다.
x = np.linspace( -np.pi, np.pi, 101) # 100 steps between -pi and pi
y = np.cos( 2*x ) # numpy가 제공하는 수학 함수
plt.plot( x, y )
plt.show()
다중 그래프 그리기
x = np.linspace(-np.pi,np.pi,101) # 100 steps between -pi and pi
y = np.cos( 2*x )
z = np.exp( -x**2 )
fig = plt.figure()
axes = fig.add_subplot(1,2,1)
axes.plot( x, y )
axes2 = fig.add_subplot(1,2,2)
axes2.plot( x, z )
plt.show()
[참고] np. 을 생략하려면 numpy 라이브러리를 통째로 도입한다.
일반적인 math 라이브러리와 혼동될 수 있으므로 주의하여야 한다.
from numpy import *
x = linspace( -pi, pi, 101) # 100 steps between -pi and pi
y = cos( 2*x ) # numpy가 제공하는 수학 함수
plt.plot( x, y )
plt.show()
배열 만들기¶
np.array() 함수
import numpy as np
a = np.array([0, 1, 2, 3, 4])
a
파이썬의 리스트 데이터형 보다 더 효율적이다.
배열의 차원과 원소의 갯수
a.ndim
len(a)
2차원 배열
b = np.array([[0, 1, 2], [3, 4, 5]])
b
배열의 차원과 원소의 갯수
b.ndim
len(b) # 첫번째 차원의 크기 (행의 갯수)를 반환한다.
행과 열의 갯수
b.shape
np.arange() 함수
np.arange(10)
복수 인자: 시작, 끝, 간격
np.arange(1, 9, 2) # 끝은 포함하지 않는다.
실수 범위를 일정 간격으로 나누는 경우에 유용하다.
np.arange(1, 2, 0.2) # 끝은 포함하지 않는다.
끝점을 포함하고 싶다면, 다음과 같은 트릭을 쓸 수도 있다.
np.arange(1, 2.0001, 0.2)
np.linspace() 함수
시작, 끝, 점의 갯수
a = np.linspace(0, 1, 6)
a
같은 간격으로 끝점을 포함하지 않으려면, 점의 갯수를 하나 줄이고 endpoint=False 로 설정한다.
a = np.linspace(0, 1, 5, endpoint=False)
a
a = np.linspace(0, 1, 5, endpoint=True)
a
여러가지 행렬¶
단위 행렬
a = np.eye(3)
a
영 행렬
b = np.zeros((2, 2))
b
원소가 1인 행렬
c = np.ones((2, 3))
c
1차원 벡터를 대각 행렬로 만들기
d = np.diag(np.array([1, 2, 3, 4]))
d
다른 데이타 형식의 배열¶
복소수 배열
d = np.array([1+2j, 3+4j, 5+6*1j])
d
난수 발생¶
a = np.random.rand(4) # 0 과 1 사이의 균등한 분포
a
가우스 분포
b = np.random.randn(4) # Gaussian
b
난수 발생기의 초기화
np.random.seed(1234) # Setting the random seed
초기화에 필요한 정수를 만들려면, time 모듈을 사용하면 편리하다.
import time
time.time() # 1970년 1월 1일 0시 0분 0초를 기준으로 현재까지 지나간 시간을 초 단위로 리턴
np.random.seed( int(time.time()) ) # Setting the random seed
인덱싱과 슬라이싱¶
파이썬의 리스트와 같은 방식이 적용된다.
a = np.arange(10)
a
인덱싱¶
a[0], a[2], a[-1]
슬라이싱¶
마지막 인덱스는 포함되지 않는다.
a[1:3]
시작의 디폴트 값은 0 이다.
a[:4]
시작:끝:간격 조건을 명시하는 경우
a[2:9:3] # [ 시작:끝:간격 ]
원소를 역순으로 배치하려면
a[::-1] # 원소를 역순으로 배치
다차원 배열의 인덱싱¶
a = np.diag(np.arange(3))
a
a[1, 1]
a[2, 1] = 10 # third row, second column
a
a[1] # second row
배열의 수치적 연산¶
원소별 연산¶
스칼라와의 연산
a = np.array([1, 2, 3, 4])
a
a + 1
2**a
배열 사이의 연산은 해당 원소 끼리의 연산이다.
b = np.ones(4) + 1
b
a - b
이차원 배열의 곱셈은 행렬 곱셈이 아니다.
a * b # 같은 위치의 원소 끼리의 곱셈이다
c = np.ones((3, 3))
c
c * c # 같은 위치의 원소 끼리의 곱셈이다
행렬 곱셈은 dot() 을 사용한다.
c.dot(c) # 행렬 곱셈
행렬의 곱셈 : np.dot( A, B )
np.dot( c, c ) # 행렬 곱셈
배열의 비교¶
같은 위치에 있는 원소들을 서로 비교한다.
a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])
a == b
a > b
배열을 통째로 비교하려면
a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])
c = np.array([1, 2, 3, 4])
np.array_equal(a, b)
np.array_equal(a, c)
모든 원소들이 같은 경우에만 참이다
배열의 논리 연산¶
a = np.array([1, 1, 0, 0], dtype=bool)
a
b = np.array([1, 0, 1, 0], dtype=bool)
b
np.logical_or(a, b)
np.logical_and(a, b)
배열의 초월 함수¶
x = np.linspace(-np.pi,np.pi,13) # 12 steps between -pi and pi
x
np.sin(x)
x = np.arange(5)
x
np.log(x)
np.exp(x)
원소들의 합
x = np.array([1, 2, 3, 4])
np.sum(x)
또는
x.sum()
최대값, 최소값
x = np.array([1, 3, 2])
x.max()
x.min()
최대값, 최소값의 인덱스
x.argmax() #최대값의 인덱스
x.argmin() #최소값의 인덱스
논리 연산
np.all([True, True, False])
np.any([True, True, False])
[예] 같은 위치에 있는 모든 원소에 대하여, a 보다 b 가 같거나 크고, b 보다 c 가 같거나 큰가를 확인한다.
a = np.array([1, 2, 3, 2])
b = np.array([2, 2, 3, 2])
c = np.array([6, 4, 4, 5])
((a <= b) & (b <= c)).all()
통계¶
x = np.array([1, 1, 2, 3, 5])
x.mean()
np.median(x) # 가운데에 위치한 값
x.std() # 표준편차