주대각성분 또는 주대각선 (main diagonal, leading diagonal, principal diagonal, primary diagonal, major diagonal) 은 행렬의 k행 k열의 성분들을 말합니다. 

 

대각행렬(diagonal matrix) 및 그외 특수한 행렬에 대해서는 https://rfriend.tistory.com/141 를 참고하세요. 

 

 mail diagonal

 

 

이번 포스팅에서는 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

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다. 

행복한 데이터 과학자 되세요!  :-)

 

728x90
반응형
Posted by Rfriend
,