Python/Numpy

[Numpy] 파이썬 대각 행렬, 대각 성분 추출 함수 np.diag 사용법

jimmy_AI 2022. 1. 6. 23:58
반응형

파이썬 넘파이 대각 원소 추출, 대각 행렬 함수 : np.diag

안녕하세요. 파이썬의 넘파이 라이브러리에서 대각 원소를 추출하고

대각 행렬을 만들어낼 수 있는 함수인 np.diag의 사용법에 대해서

간단히 다루어보도록 하겠습니다.

 

참고로, 이 포스팅은 numpy 공식 document에서 제공하는

np.diag 함수에 대한 글을 바탕으로 작성되었습니다.

 

np.diag 2차원 행렬 input : 대각 성분 추출

참고로, np.diag 함수는 1차원과 2차원 array만을 input으로 받을 수 있습니다.

만일 3차원 이상의 array를 넣으려 시도한다면 오류가 발생합니다.

 

2차원 array와 1차원 array를 input으로 넣었을 때 기능이 다른데요.

2차원 행렬을 input으로 넣으면 대각 원소만을 추출하여 1D array로 반환합니다.

 

또한, k를 지정하여 오른쪽/왼쪽으로 k칸 치우친 방향의 대각 성분도 획득 가능합니다.

원리를 그림으로 표현하면 다음과 같습니다.

참고로, input이 꼭 정사각 행렬일 필요는 없으며, k를 지정하지 않은 경우(k = 0) 기준,

(0, 0), (1, 1), ... 성분을 가져오게 되는 원리입니다.

 

예시 코드는 아래처럼 작성이 가능합니다.

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

np.diag(a)
# array([1, 5, 9])

np.diag(a, k = 1)
# array([2, 6])

np.diag(a, k = -1)
# array([4, 8])

 

3차원 이상의 array를 input으로 넣으면 다음과 같이 오류 메시지가 등장합니다.

b = np.array([[[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]],
              [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]]])

np.diag(b)
# 3차원 array 에러 : ValueError: Input must be 1- or 2-d.

ValueError: Input must be 1- or 2-d. 메시지로 1D 혹은 2D array만 input으로

가능하다는 것을 확인하실 수 있습니다.

반응형

np.diag 1차원 벡터 input : 대각 행렬 생성

1D array를 input으로 넣은 경우는 해당 성분들을 차례대로 대각 성분으로 가지는

대각 행렬을 생성하게 됩니다.

 

참고로, 여기서도 k값을 지정하여 k칸 만큼 치우친 대각 행렬을 만들 수 있습니다.

원리와 예시 코드는 아래와 같습니다.

np.diag([1, 2, 3])
# 결과
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

np.diag([1, 2, 3], k = 1)
# 결과
array([[0, 1, 0, 0],
       [0, 0, 2, 0],
       [0, 0, 0, 3],
       [0, 0, 0, 0]])

np.diag([1, 2, 3], k = -1)
# 결과
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0]])

 

 

파이썬의 행렬에서 대각 성분만 추출한 행렬 만들기

2D 행렬에서 대각 성분만을 추출한 대각 행렬을 만드는 것은

np.diag를 두 번 겹쳐 사용하여 만들 수 있습니다.

 

2D와 1D array에서 사용법이 다르다는 원리를 이용하여

아래와 같이 결과를 가져올 수 있습니다.

예시 코드는 다음처럼 간단하게 작성해볼 수 있습니다.

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# np.diag 2번 겹치기
np.diag(np.diag(a))
# 결과
array([[1, 0, 0],
       [0, 5, 0],
       [0, 0, 9]])