본문 바로가기
컴퓨터 언어/Python_NumPy

[ Numpy ] 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)

by SuperMemi 2022. 4. 11.
반응형

[ Numpy ] 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)

 

Numpy 에 존재하는 대각 행렬 관련 함수에 대해 알아보자!



[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

 

[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

NumPy 소개 Numpy(보통 "넘파이"라고 발음)는 수치 해석용 Python 패키지이다. 다차원의 행렬 자료구조인 ndarray를 지원하여 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython

supermemi.tistory.com


목차

  • np.eye
  • np.identity
  • np.diag

np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')

 

(N x M) 크기의 2차원 행렬을 만들어 주는 함수.k 에 따라 시작위치가 달라짐

  • N : Row 수 (필수적 요소) 
  • M : Column 수(따로 설정하지 않으면 NxN의 정사각행렬이 만들어짐)
  • k : 대각행렬이 값을 가지기 시작하는 위치 
>>> import numpy as np

# (example) 2 by 2 행렬, 시작위치 0
>>> np.eye(N=2) 
array([[1., 0.],
       [0., 1.]])

# (example) 2 by 3 행렬, 시작위치 0
>>> np.eye(N=2,M=3) 
array([[1., 0., 0.],
       [0., 1., 0.]])
     
# (example) 7 by 7 행렬, 시작위치 +2
>>> np.eye(7,k=2) 
array([[0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.]])

 # (example) 7 by 7 행렬, 시작위치 -2
>>> np.eye(7,k=-2)
array([[0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0.]])

np.identity(n, dtype=None)

 

np.identity 는 항상 정사각 행렬만 만든다는 점이 특징이다.

 

np.identity의 소스코드를 보면 다를거 없이 그냥 np.eye 를 불러와 사용한다.

 

GitHub - numpy/numpy: The fundamental package for scientific computing with Python.

The fundamental package for scientific computing with Python. - GitHub - numpy/numpy: The fundamental package for scientific computing with Python.

github.com

>>> import numpy as np
>>> 
>>> np.identity(7)
array([[1., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 1.]])

np.diag(v, k=0)

 

두가지 기능이 있다.

  1. 대각행렬 생성 기능 : v가 1차원 배열일때, v를 대각행렬로 하는 2차원 배열을 만들어줌
  2. 대각요소 추출 기능 : v가 2차원 배열일때, v의 대각선 요소들을 1차원으로 뽑아줌

마찬가지로 k를 이용하여 원하는 위치에 생성 또는 추출 할 수 있다.

>>> import numpy as np

# 기능 1 : 대각행렬 생성
>>> x = np.arange(4)
>>> np.diag(x)
array([[0, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 2, 0],
       [0, 0, 0, 3]])
>>> np.diag(x,k=1)
array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 2, 0],
       [0, 0, 0, 0, 3],
       [0, 0, 0, 0, 0]])

# 기능 2 : 대각행렬 요소 추출
>>> x = np.arange(9).reshape((3,3))
>>> x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> np.diag(x)
array([0, 4, 8])
>>> np.diag(x,k=1)
array([1, 5])
>>> np.diag(x,k=-1)
array([3, 7])

 

[np.diag 응용]

만약 2차원 배열(2D-array)에서 대각행렬의 요소만 남겨서 대각 행렬을 만들려고 한다면,

np.diag를 두번 겹쳐서 사용하면 된다!!

>>> import numpy as np

# np.diag 응용
>>> x = np.arange(9).reshape((3,3))
>>> x
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
       
>>> np.diag(x)
array([0, 4, 8])

>>> np.diag(np.diag(x))
array([[0, 0, 0],
       [0, 4, 0],
       [0, 0, 8]])

다음글 : 대각 행렬 채우기 (np.fill_diagonal)

 

[ Numpy ] 대각 행렬 채우기 (np.fill_diagonal)

[ Numpy ] 대각 행렬 채우기 (np.fill_diagonal) 이전글 : 대각행렬만들기 목차 np.fill_diagonal wrap 적용! 3차원 이상에서는 어떻게? np.fill_diagonal(a, val, wrap=False) 말 그대로 대각선 요소들의..

supermemi.tistory.com


 

반응형