반응형
[ Numpy ] 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)
Numpy 에 존재하는 대각 행렬 관련 함수에 대해 알아보자!
[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)
목차
- 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 를 불러와 사용한다.
>>> 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)
두가지 기능이 있다.
- 대각행렬 생성 기능 : v가 1차원 배열일때, v를 대각행렬로 하는 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)
반응형