Python/Numpy

[Numpy] 파이썬 상삼각행렬 생성 함수 : np.triu 사용법

jimmy_AI 2022. 2. 5. 12:45
반응형

넘파이 상삼각성분만 남기기 : np.triu()

이번 글에서는 파이썬 넘파이 라이브러리에서 행렬을 다룰 때,

상삼각행렬에 해당하는 원소만 남길 수 있는 np.triu() 함수의 사용법을

간단히 살펴보도록 하겠습니다.

 

정방행렬 예시

np.triu 함수의 사용법은 array와 k값을 차례대로 인자로 적어주면 되며,

k를 생략할 경우 기본 값은 0으로 지정됩니다.

 

k의 의미는 가장 윗줄부터 0의 개수가 k개부터 시작한다는 의미로 보시면 되며,

아래로 1줄씩 내려갈 때 마다 0의 개수가 1개씩 많아지는 원리입니다.

 

먼저, 4 x 4 정방행렬에 np.triu 함수를 적용한 예시를 살펴보겠습니다.

import numpy as np

a = np.array([[1, 2, 3, 4], 
             [5, 6, 7, 8],
             [9, 10, 11, 12],
             [13, 14, 15, 16]])

np.triu(a)
'''
array([[ 1,  2,  3,  4],
       [ 0,  6,  7,  8],
       [ 0,  0, 11, 12],
       [ 0,  0,  0, 16]])'''

np.triu(a, k = 1)
'''
array([[ 0,  2,  3,  4],
       [ 0,  0,  7,  8],
       [ 0,  0,  0, 12],
       [ 0,  0,  0,  0]])'''

np.triu(a, k = -1)
'''
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 0, 10, 11, 12],
       [ 0,  0, 15, 16]])'''

위의 예시처럼 k는 음의 정수로도 지정이 가능합니다.

 

위 결과를 그림으로 요약하면 다음과 같습니다.

0의 개수가 가장 윗줄 기준 k개부터 시작하여 1개씩 증가함을 볼 수 있었습니다.

반응형

정방행렬이 아닌 경우

np.triu 메소드는 input array가 정방행렬이 아닌 경우에도 사용에는 제약이 없습니다.

 

마찬가지로 0의 개수가 k개부터 시작한다라는 사실에 주목하시면

원리 이해는 쉽게 될 것으로 생각됩니다.

 

3 x 4 행렬 예시에서의 소스 코드와 원리를 그림으로 표현한 결과는 아래와 같습니다.

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

np.triu(b)
'''
array([[ 1,  2,  3,  4],
       [ 0,  6,  7,  8],
       [ 0,  0, 11, 12]])'''

np.triu(b, k = 1)
'''
array([[ 0,  2,  3,  4],
       [ 0,  0,  7,  8],
       [ 0,  0,  0, 12]])'''

np.triu(b, k = 2)
'''
array([[0, 0, 3, 4],
       [0, 0, 0, 8],
       [0, 0, 0, 0]])'''

 

 

3차원 이상 고차원 배열인 경우

2차원을 넘는 고차원 array에서도 np.triu 함수의 적용이 가능합니다.

 

이 경우는 마지막 두 axis를 기준으로 각 행렬에 대하여 triu 메소드가 적용된 결과

반환하게 됩니다.

 

이해를 돕기 위하여,

2 x 3 x 3 shape을 가지는 3차원 배열에 np.triu()를 적용한 예시를 살펴보겠습니다.

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

              [[9, 8, 7],
              [6, 5, 4],
              [3, 2, 1]]])

np.triu(c)
'''
array([[[1, 2, 3],
        [0, 5, 6],
        [0, 0, 9]],

       [[9, 8, 7],
        [0, 5, 4],
        [0, 0, 1]]])'''

각 3 x 3 행렬에 대하여 k = 0인 np.triu()가 적용되었음을 알 수 있었습니다.