Numpy 연산-2
Written by
metterian
on
on
Numpy로 선형대수 지식 끼얹기
Basic
영벡터
- 원소가 모두 0인 벡터(행렬)
np.zeros(dim)
을 통해 생성, dim = 값 혹은 튜플
import numpy as np
np.zeros([3,3])
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
일벡터
- 원소가 모두 1인 행렬(벡터)
np.ones(dim)
np.ones(2)
array([1., 1.])
np.ones([3,3])
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
대각 행렬(diagonal matrix)
- 대각 성분이 0이 아닌 행렬
np.diag(main_diagonal)
np.diag((2,4))
array([[2, 0],
[0, 4]])
np.diag([1,3,5])
array([[1, 0, 0],
[0, 3, 0],
[0, 0, 5]])
항등 행렬(identity matrix)
- main diagonal이 1인 대각 행렬
np.eye()
를 사용
np.eye(2, dtype=np.int64)
array([[1, 0],
[0, 1]])
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
행렬곱 (dot product)
- 행렬간 곱연산
np.dot()
or@
사용
mat_1 = np.array([[1,4],
[2,3]])
mat_2 = np.array([[7,9],
[0,6]])
mat_1.dot(mat_2)
array([[ 7, 33],
[14, 36]])
mat_1 @ mat_2
array([[ 7, 33],
[14, 36]])
Advanced
트레이스(trace)
- main diagonal의 합
np.trace()
사용
arr = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
# arr is 3 by 3 matrix
arr.trace()
15
np.eye(2, dtype=int)
array([[1, 0],
[0, 1]])
np.eye(2, dtype=int).trace()
2
행렬식(determinant)
np.linalg.det()
로 계산
arr_2 = np.array([[2,3],
[1,6]])
np.linalg.det(arr_2)
9.000000000000002
arr_3 = np.array([[1,4,7],
[2,5,8],
[3,6,9]])
np.linalg.det(arr_3)
0.0
역행렬
np.linalg.inv()
를 사용한다.
mat = np.array([[1,4],
[2,3]])
mat_inv = np.linalg.inv(mat)
mat_inv
array([[-0.6, 0.8],
[ 0.4, -0.2]])
(mat @ mat_inv).round(3)
array([[ 1., 0.],
[-0., 1.]])
고유값과 고유벡터(eigenvalue & eigenvector)
- 정방행렬 A에 대해, $Ax = \lambda x$를 만족하는 상수 $\lambda$ 와 이에 대응하는 벡터
np.linalg.eig()
로 계산- 결과값의 column의 기준으로 eigen vector의 결과값이 나타난다.
mat = np.array([[2,0,-2],
[1,1, -2],
[0,0,1]])
np.linalg.eig(mat)
(array([1., 2., 1.]),
array([[0. , 0.70710678, 0.89442719],
[1. , 0.70710678, 0. ],
[0. , 0. , 0.4472136 ]]))
검증
eig_val, eig_vec = np.linalg.eig(mat)
eig_val
array([1., 2., 1.])
eig_vec
array([[0. , 0.70710678, 0.89442719],
[1. , 0.70710678, 0. ],
[0. , 0. , 0.4472136 ]])
mat @ eig_vec[:, 0] # Ax
array([0., 1., 0.])
eig_val[0] * eig_vec[:, 0] # lambda x
array([0., 1., 0.])
예제
1. 어떤 벡터가 주어졌을때 L2 Norm을 구하는 함수 get_L2_norm()
을 작성하세요.
- 매개변수: 1차원 벡터(
np.array
) - 반환값: 인자로 주어진 벡터의 L2 Norm 값(
number
)
def get_L2_norm(array):
return np.linalg.norm(array)
get_L2_norm([5])
5.0
어떤 행렬이 singular matrix인지 확인하는 함수 is_singular()
를 작성하세요
- 매개변수 : 2차원 벡터(
np.array
) - 반환값 : 인자로 주어진 벡터가 singular하면 True, non-singular하면 False를 반환
A = np.array([[2,-3,5],
[1,7,4],
[0,0,0]])
def is_singluar(array):
try:
inv_mat = np.linalg.inv(array)
except:
inv_mat = None
return bool(inv_mat)
is_singluar(A)
False