python 모듈인 numpy를 알아보고 선형대수 연산 기초를 알아본다.
numpy 모듈 사용하기
import numpy as np
L = range(1000)
%timeit [i**2 for i in L]
N = np.arrange(1000)
%timeit N**2
실행 시켜보면 넘파이를 사용한 배열 이 더 빠른것을 확인 할 수 있다.
arr = np.array([1,2,3])
arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr.shape
arr_3d.shape
다차원 배열을 선언할 수 있고 shape 을 이용해 배열의 형태를 확인할 수도 있다.
numpy 연산
- 벡터와 스칼라 연산
y = np.array([1,2,3])
z = np.array([2,9,20])
print("더하기 : {}".format(y + z))
print("빼기 : {}".format(y - z))
print("곱하기 : {}".format(y * z))
print("나누기 : {}".format(y / z))
- 벡터와 벡터 연산
- 각 벡터의 요소 끼리 연산
x = np.array([1,2,3])
c = 5
print("더하기 : {}".format(x + c))
print("빼기 : {}".format(x - c))
print("곱하기 : {}".format(x * c))
print("나누기 : {}".format(x / c))
array의 indexing과 slicing
- 파이썬의 리스트와 유사하게 진행
W = np.array([1,2,3,4],[5,6,7,8],[9,10,11,12])
W[0,0]
w[2,3]
W[0:2, 1:3]
# 2,3
# 6,7
W[0:2, 0:4]
W[0:2]
W[0:2, :]
W[0:3, 2:4]
W[:, 2:4]
Array의 Broadcasting
-
피연산자가 연산 가능하도록 변환을 하여 연산을 진행하는 것을 Broadcasting 이라 함.
-
M x N, M x 1
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
x = np.array([0,1,0])
x = x[:, None]#transpose
print(a+x)
- M x N, 1 x N
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
y = np.array([0,1,-1])
print(a*y)
- M x 1, 1 x N
t = np.array([1,2,3])
t = t[:, None] #transpose
u = np.array([2,0,-2])
print(t+u)
영벡터(행렬)
- 원소가 모두 0인 벡터(행렬)
np.zeros(3)
np.zeros((3,3))
np.zeros((3,3,3))
일벡터(행렬)
- 원소가 모두 1인 벡터(행렬)
np.ones(2)
np.ones((3,3))
대각행렬(diagonal matrix)
- Main diagonal을 제외한 성분이 0인 행렬
np.diag((2,4))
np.diag((1,3,5))
항등행렬(identity matrix)
- Main diagonal이 1인 대각행렬
- 인자로 들어가는 dtype의 기본 값은 float
np.eye(2, dtype=int)
np.eye(3, dtype=float)
행렬곱(dot product)
- 행렬간의 곱연산
mat_1 = np.array([[1,4],[2,3]])
mat_2 = np.array([[7,9],[0,6]])
mat_1.dot(mat_2)
mat_1 @ mat_2
트레이스(trace)
- main diagonal의 합
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr.trace()
행렬식(determinant)
- 행렬을 대표하는 값들 중 하나
arr_2 = np.array([[2,3],[1,6]])
np.linalg.det(arr_2)
arr_3 = np.array([[1,4,7],[2,5,8],[3,6,9]])
np.linalg.det(arr_3)
역행렬(inverse matrix)
- 행렬 A에 대해 AB = BA = I 를 만족하는 행렬 B = A^-1
mat = np.array([[1,4],[2,3]])
mat_inv = np.linalg.inv(mat)
mat @ mat_inv
고유값과 고유벡터(eigenvalue and eigenvector)
- 정방행렬 A에 대해 $Ax = \lambda x$를 만족하는 상수$\lambda$와 이에 대응하는 벡터
mat = np.array([[2,0,-2],[1,1,-2],[0,0,1]])
eig_val, eig_vec = np.linalg.eig(mat)
mat @ eig_vec[:, 0]
eig_val[0] * eig_vec[:, 0]
- 1차원 벡터의 norm 값을 구하는 함수 작성
- 2차원 벡터의 singular matrix 인지 확인하는 함수 작성