Python/Numpy

[Numpy] 파이썬 단위행렬 함수 np.eye(), 역행렬 함수 LA.inv()

jimmy_AI 2022. 5. 15. 20:19
반응형

파이썬 넘파이 단위행렬, 역행렬 함수

Numpy 라이브러리에서 단위행렬을 손쉽게 설정할 수 있는 np.eye()와

역행렬을 구하여 반환받을 수 있는 LA.inv() 혹은 np.linalg.inv()에 대해서 다루어보겠습니다.

 

 

단위행렬 함수 : np.eye

기본적으로 np.eye(n) 형태로 n * n 사이즈(n은 정수)의 단위행렬을 생성할 수 있습니다.

import numpy as np

np.eye(4)

'''
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])'''

 

np.eye 내에 dtype 인자를 설정하여 배열 내 값들의 자료형을 지정할 수 있습니다.

np.eye(5, dtype = int)

'''
array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])'''

 

k인자를 설정하면 양수로 지정 시에는 1의 위치가 해당 칸만큼 오른쪽으로 이동하며,

음수로 지정 시에는 같은 원리로 왼쪽으로 1의 위치들이 이동하여 배열이 설정됩니다.

np.eye(4, k = 1)

'''
array([[0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 0.]])'''

np.eye(4, k = -1)

'''
array([[0., 0., 0., 0.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.]])'''
반응형

역행렬 함수 : LA.inv 또는 np.linalg.inv

정방행렬에 대하여 역행렬을 반환해주는 함수도 넘파이에서 지원하고 있습니다.

해당 함수는 import의 형태에 따라 LA.inv 또는 np.linalg.inv로 사용됩니다.

import numpy.linalg as LA
import numpy as np

a = np.array([[1, 2],
              [3, 4]])

LA.inv(a) # 또는 np.linalg.inv(a)

'''
array([[-2. ,  1. ],
       [ 1.5, -0.5]])'''

b = np.array([[1, 2, 3],
              [1, 3, 6],
              [2, 5, 10]])

LA.inv(b) # 또는 np.linalg.inv(b)

'''
array([[ 0., -5.,  3.],
       [ 2.,  4., -3.],
       [-1., -1.,  1.]])'''

 

여기서 해당 배열이 2차원 이상일 경우에는 마지막 두 axis를 기준으로

각각의 부분 행렬에 대하여 구한 역행렬들을 모아서 반환시켜줍니다.

c = np.array([[[1, 2],
              [3, 4]],

              [[5, 6],
              [7, 8]]])

LA.inv(c)

'''
array([[[-2. ,  1. ],
        [ 1.5, -0.5]],

       [[-4. ,  3. ],
        [ 3.5, -2.5]]])'''

 

다만, singular matrix(역행렬이 존재하지 않는 행렬)가 포함되거나

마지막 두 axis가 정방행렬이 아니면 오류가 발생되므로 사용에 유의가 필요합니다.

# 역행렬이 존재하지 않는 경우
o = np.array([[0, 0],
              [0, 0]])

LA.inv(o) # LinAlgError: Singular matrix

# 정사각행렬이 아닌 경우
d = np.array([[1, 2, 3],
              [4, 5, 6]])

LA.inv(d) # LinAlgError: Last 2 dimensions of the array must be square