💡np.array()
의 인자는 하나! (리스트나 튜플 형태로 넘겨주어야 함)
벡터의 각 원소에 대해서 연산을 진행
벡터의 같은 인덱스끼리 연산이 진행됨!
Python의 리스트와 유사하게 진행
Indexing
: Array에서 특정 위치의 원하는 원소를 가져올 때 인덱싱을 이용
Slicing
: Array에서 특정 범위의 원하는 원소들을 가져올 때
Numpy가 연산을 진행하는 특수한 방법
기본적으로 같은 Type의 data에 대해서만 연산이 적용가능
하지만 만약 피연산자가 연산 가능하도록 변환이 가능하다면 연산이 가능.
이를 Broadcasting이라고 한다.
(3 x 3)와 (3 x 1)를 연산하면 3 x 1을 3 x 3 으로 차원 수를 맞추고 연산을 한다.
(3 x 3)와 (1 x 3)를 연산하면 1 x 3을 3 x 3 으로 차원 수를 맞추고 연산을 한다.
(3 x 1)와 (1 x 3)를 연산하면 둘 다 3 x 3 으로 차원 수를 맞추고 연산을 한다.
np.zeros(dim)
을 통해 생성, dim은 값 혹은 튜플(, )np.zeros(2)
# array([0., 0.])
np.zeros((3, 3))
# array([[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]])
np.ones(dim)
을 통해 생성, dim은 값 혹은 튜플(,)np.ones(2)
# array([1., 1.])
np.ones((3, 3))
# array([[1., 1., 1.],
# [1., 1., 1.],
# [1., 1., 1.]])
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]])
np.eye(n[, dtype=float])
를 사용np.eye(2, dtype=int)
# array([[1, 0],
# [0, 1]])
np.eye((3, dtype=float))
# array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
*dtype: data type, (dtype=int, uint, float, complex, ...)
np.dot()
, @
사용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]])
np.trace()
를 사용arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr
# array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
arr.trace()
# 15
np.eye(2, dtype=int).trace()
# 2
np.linalg.det()
으로 계산arr_2 = np.array([[2, 3], [1, 6]])
arr_2
# 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]])
arr_3
# array([[1, 4, 7],
# [2, 5, 8],
# [3, 6, 9]])
# 1(5 * 6 - 6 * 8) - 4(2 * 9 - 3 * 8) + 7(2 * 6 - 3 * 5)
# -3 + 24 - 21
# 0
np.linalg.det(arr_2)
# 0.0
⭐행렬식 값이 0이면 선형변환 과정에서 차원에 손실이 발생한다!
np.linalg.inv()
을 사용mat = np.array([[1, 4], [2, 3]])
mat
# array([[1, 4],
# [2, 3]])
mat_inv = np.linalg.inv(mat)
# array([[-0.6, 0.8],
# [ 0.4, -0.2]])
mat @ mat_inv
# array([[1., 0.],
# [0., 1.]])
np.linalg.eig()
로 계산mat = np.array([[2, 0, -2], [1, 1, -2], [0, 0, 1]])
mat
# array([[ 2, 0, -2],
# [ 1, 1, -2],
# [ 0, 0, 1]])
mat_linalg.eig(mat)
# (array([1., 2., 1.]),
# array([[0. , 0.70710678, 0.89442719],
# [1. , 0.70710678, 0. ],
# [0. , 0. , 0.4472136 ]]))
🔥고유값과 고유벡터가 나오는데,
고유값은 고유벡터의 열벡터에 대한 고유값이다.
🔎Validation
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.])
Numpy 연산
Numpy 와 선형대수
.zeros()
.ones()
.diag()
.eye()
@
/ .dot()
.trace()
.linalg.det()
.linalg.inv()
.linalg.eig()
어떤 벡터가 주어졌을 때 L2 norm을 구하는 함수 get_L2_norm()
을 작성하세요
np.array
)number
)import numpy as np
mat = np.array([1,2,3,4])
def get_L2_norm(mat):
return np.linalg.norm(mat, ord=2)
print(get_L2_norm(mat))
# 5.477225575051661
어떤 행렬이 singular matrix 인지 확인하는 함수 is_singular()
를 작성하세요
np.array
)True
, non-singular하면 False
를 반환import numpy as np
mat_1 = np.array([[1,2],[3,4]])
mat_2 = np.array([[1,2],[2,4]])
def is_singular(mat):
return True if np.linalg.det(mat) == 0 else False
print(is_singular(mat_1))
# False
print(is_singular(mat_2))
# True