[Python NumPy] 주대각성분 가져오기(return main diagonal), 뒤집은 후 주대각성분 가져오기(main diagonal after flipping), 주대각성분 채우기(fill main diagonal)
Python 분석과 프로그래밍/Python 데이터 전처리 2022. 3. 6. 23:15주대각성분 또는 주대각선 (main diagonal, leading diagonal, principal diagonal, primary diagonal, major diagonal) 은 행렬의 k행 k열의 성분들을 말합니다.
대각행렬(diagonal matrix) 및 그외 특수한 행렬에 대해서는 https://rfriend.tistory.com/141 를 참고하세요.
이번 포스팅에서는 Python NumPy 를 이용해서 주대각성분(main diagonal)을 다루는 방법을 소개하겠습니다.
(1) 주대각성분 가져오기 (returning a main diagonal)
(2) 주대각성분을 기준으로 수평/ 수직으로 뒤집기 (flip horizontally/ vertically by main diagonal)
(3) 주대각성분 채우기 (filling main diagonal)
(4) 대각행렬 만들기 (creating a diagonal matrix)
(1) 주대각성분 가져오기 (returning a main diagonal): np.diagonal()
import numpy as np
## making a sample 2-D array
arr = np.arange(9).reshape(3, 3)
arr
# array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])
## (1) main diagonal
np.diagonal(arr)
# array([0, 4, 8])
## (2) main diagonal
arr.diagonal()
# array([0, 4, 8])
(2) 수평/ 수직으로 뒤집은 후 주대각성분 가져오기 (returning main diagonal after flipping)
(2-1) 수평으로 뒤집은 후 주대각성분 가져오기 (returning main diagonal after flipping horizontally)
: np.fliplr(arr).diagonal()
# Horizontal flip
np.fliplr(arr) # flip from left to right
# array([[2, 1, 0],
# [5, 4, 3],
# [8, 7, 6]])
## main diagonal of horizontal flip
np.fliplr(arr).diagonal()
# array([2, 4, 6])
(2-2) 수직으로 뒤집은 후 주대각성분 가져오기 (returning main diagonal after flipping vertically)
: np.flipud(arr).diagonal()
# Vertical flip
np.flipud(arr) # flip from up to down
# array([[6, 7, 8],
# [3, 4, 5],
# [0, 1, 2]])
## main diagonal of vertical flip
np.flipud(arr).diagonal()
# array([6, 4, 2])
(3) 주대각성분 채우기 (filling main diagonal) : np.fill_diagonal()
## filling the main diagonal of the given array of any dimensionality
## using np.fill_diagonal(a, val)
np.fill_diagonal(arr, val=999)
arr
# array([[999, 1, 2],
# [ 3, 999, 5],
# [ 6, 7, 999]])
(4) 대각행렬 만들기 (creating a diagonal matrix)
대각행렬(diagonal matrix)은 주대각성분에만 원소 값이 있고, 주대각성분 외의 원소는 값이 모두 '0'인 행렬을 말합니다.
아래의 예에서는 NumPy로 대각행렬을 만들기 위해서, 먼저 np.zeros([m, n]) 로 '0'의 값만을 가지는 m by n 행렬을 만든 후에, np.fill_diagonal(array, val) 의 val 부분에 원하는 주대각성분의 값(예: val=[1, 2, 3])을 입력해주어서 대각행렬(diag(1, 2, 3))을 만들어 보겠습니다.
## making a diagonal matrix: diag(1, 2, 3)
arr2 = np.zeros([3, 3])
arr2
# array([[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]])
## filling main diagonal with [1, 2 3] values using np.fill_diagonal()
np.fill_diagonal(arr2, val=[1, 2, 3])
arr2
# array([[1., 0., 0.],
# [0., 2., 0.],
# [0., 0., 3.]])
[ Reference ]
1. 주대각성분 (또는 주대각선, main diagonal)
: https://en.wikipedia.org/wiki/Main_diagonal
2. numpy.diagonal()
: https://numpy.org/doc/stable/reference/generated/numpy.diagonal.html
3. numpy.fill_diagonal()
: https://numpy.org/doc/stable/reference/generated/numpy.fill_diagonal.html
4. 대각행렬(diagonal matrix) 및 특수행렬: https://rfriend.tistory.com/141
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)