NumPy(넘파이) 특징
- 과학 계산을 위한 라이브러리
- 행렬/배열 처리 및 연산
- 난수생성
배열의 생성
리스트에서 행렬/배열 생성
import numpy as np
a = [[1,2,3], [4,5,6]]
b = np.array(a)
print(b) # [[1 2 3] [4 5 6]]
print(b.ndim) # 2
print(b.shape) # (2, 3)
print(b[0,0]) # 1
특수한 배열의 생성
print(np.arange(10)) # [0 1 2 3 4 5 6 7 8 9]
print(np.arange(5, 10)) # [5 6 7 8 9]
print(np.zeros((2,2))) # [[0. 0.] [0. 0.]]
print(np.ones((2,3))) # [[1. 1. 1.] [1. 1. 1.]]
print(np.full((2,3), 5)) # [[5 5 5] [5 5 5]]
print(np.eye(3)) # [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
배열의 차원 변환
a = np.arange(20)
b = a.reshape((4, 5))
print(b) # [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]]
Numpy 슬라이싱/인덱싱
lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(lst)
a = arr[0:2, 0:2]
print(a) # [[1 2] [4 5]]
a = arr[1:, 1:]
print(a) # [[5 6] [8 9]]
Numpy 연산
배열간 연산
a = np.array([1,2,3])
b = np.array([4,5,6])
c = a + b
print(c) # [5 7 9]
c = np.multiply(a, b)
print(c) # [4 10 18]
c = np.divide(a, b)
print(c) # [0.25 0.4 0.5]
dot() 함수: 행렬의 곱
arr1 = [[1,2],[3,4]]
arr2 = [[5,6],[7,8]]
a = np.array(arr1)
b = np.array(arr2)
c = np.dot(a, b)
print(c) # [[19 22] [43 50]]
모든 원소의 합: sum(), 모든 원소의 곱: prod()
a = np.array([[-1,2,3],[3,4,8]])
print('sum=', a.sum()) # sum= 19
print('sum by row=', a.sum(axis=0)) # sum by row= [ 2 6 11]
print('mean=', a.mean()) # mean= 3.1666666666666665
print('sd=', a.std()) # sd= 2.6718699236469
print('product=', a.prod()) # product= -576
기본 수학함수
- abs, fabs: 절대값
- sqrt: 제곱근
- square: 제곱
- exp: 지수 함수
- log, log10, log2, log1p: 로그 함수
- sign: 부호 함수
- ceil: 올림
- floor: 내림
- rint: 반올림
- isnan: NaN 체크
- isfinite, isinf: 유한/무한 체크
- 삼각함수: cos, cosh, sin, sinh, tan, tanh
- 역삼각함수: arccos, arccosh, arcsin, arcsinh, arctan, arctanh
선형대수(벡터/행렬연산) 함수
- diag: 대각선 원소 추출
- dot: 행렬 곱
- trace: 대각선 합
- det: 행렬식
- eig: 고유값과 고유벡터
- inv: 역행렬
- pinv: 의사역행렬
- qr: QR 분해
- svd: 특이값 분해 (SVD)
- solve: 선형방정식 Ax = b 해 구하기
- lstsq: 최소제곱해
벡터연산(내적)
x = np.array([1, 2, 3])
y = np.array([6, 23, -1])
print(x.dot(y.T)) # 49
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print(x.dot(y)) # [[ 28. 64.] [ 67. 181.]]
print(y.dot(x)) # [[ 98. 127. 156.] [ 27. 33. 39.] [ 44. 61. 78.]]
역행렬
from numpy.linalg import inv
np.random.seed()
X = np.array([[1,2,3],[1,0,0],[0,0,1]])
Y = inv(X)
print(Y) # [[ 0. 1. 0. ] [ 0.5 -0.5 -1.5] [ 0. 0. 1. ]]
print(X.dot(Y)) # [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
4.7 난수(랜덤넘버)의 생성
균등분포에서 난수생성
from numpy.linalg import inv
np.random.seed()
X = np.array([[1,2,3],[1,0,0],[0,0,1]])
Y = inv(X)
print(Y) # [[ 0. 1. 0. ] [ 0.5 -0.5 -1.5] [ 0. 0. 1. ]]
print(X.dot(Y)) # [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
정규분포
from numpy.linalg import inv
np.random.seed()
X = np.array([[1,2,3],[1,0,0],[0,0,1]])
Y = inv(X)
print(Y) # [[ 0. 1. 0. ] [ 0.5 -0.5 -1.5] [ 0. 0. 1. ]]
print(X.dot(Y)) # [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]