Numpy 연산-2

Numpy로 선형대수 지식 끼얹기

Basic

영벡터

import numpy as np
np.zeros([3,3])
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

일벡터

np.ones(2)
array([1., 1.])
np.ones([3,3])
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

대각 행렬(diagonal matrix)

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)

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)

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)

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)

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

역행렬

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)

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()을 작성하세요.

def get_L2_norm(array):
    return np.linalg.norm(array)

get_L2_norm([5])
5.0

어떤 행렬이 singular matrix인지 확인하는 함수 is_singular() 를 작성하세요

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