Python/Numpy

[Numpy] 파이썬 행렬 대각합, 행렬식 함수 : np.trace, LA.det

jimmy_AI 2022. 4. 13. 22:01
반응형

파이썬 넘파이 trace, det 구하기 함수 사용법

파이썬에서 각각 행렬의 대각합과 행렬식을 구할 수 있는 함수들인 np.trace와 np.linalg.det의

사용 예제에 대해서 살펴보도록 하겠습니다.

 

 

대각합 함수 : np.trace

2차원 정방행렬의 경우

2차원 배열의 trace는 np.trace(배열) 형태로 손쉽게 구할 수 있습니다.

 

또한, np.trace(배열, 숫자) 형태로 숫자가 양수면 우측으로 해당 칸만큼 이동한 방향의 대각합,

음수면 같은 식으로 왼쪽으로 움직인 방향의 대각합도 구할 수 있습니다.

 

기본적으로 정방행렬에 대하여 trace를 구해보는 코드는 다음과 같습니다.

import numpy as np

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

np.trace(a) # 15
np.trace(a, 1) # 8
np.trace(a, -1) # 12

이해를 돕기 위하여, 정방향 대각합 및 우측/좌측으로 1칸씩 기준이 이동된 경우에 대한

대각합 계산 원리를 아래 그림에 첨부해두었습니다.

 

2차원에서 정방행렬이 아닌 경우

정방행렬이 아닌 경우에도, trace를 구하는 것이 가능합니다.

이 경우, (0, 0), (1, 1), ...처럼 (i, i) 위치에 대하여 원소들의 합을 구하는 것으로 정의되며,

오른쪽 혹은 왼쪽으로 이동한 대각합을 구하는 것도 정방행렬과 같은 원리로 가능합니다.

 

정사각행렬이 아닌 케이스에서 대각합을 구하는 코드와 원리 표현 그림은 아래와 같습니다.

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

np.trace(b) # 7
np.trace(b, 1) # 9
np.trace(b, 2) # 11

반응형

3차원 이상 배열의 경우

3차원 이상의 고차원 배열에 대해서 np.trace 함수를 적용할 경우에는

각 내부 행렬들에 대한 대각합들을 각각 계산하여 모은 결과를 반환합니다.

 

이 경우, 내부 행렬을 지정할 axis1과 axis2를 지정해주어야 하며,

3차원 배열에서는 axis1과 axis2를 마지막 두 축인 1과 2로 각각 설정하면

각 2차원 배열들에 대한 trace를 계산한 결과를 반환받을 수 있습니다.

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

np.trace(c, axis1 = 1, axis2 = 2) # array([ 5, 13])

1, 2, 3, 4 원소가 포함된 첫 행렬과 5, 6, 7, 8 원소로 구성된 두번째 행렬의 trace인

5와 13이 모아져서 배열로 반환된 결과를 확인할 수 있습니다.

 

마찬가지로 두 번째 인자로 우측/좌측 움직임의 정도도 지정할 수 있으니 참고하세요.

np.trace(c, 1, axis1 = 1, axis2 = 2) # array([2, 6])
np.trace(c, -1, axis1 = 1, axis2 = 2) # array([3, 7])

 

 

행렬식 함수 : LA.det 혹은 np.linalg.det

2차원 배열의 경우

행렬식 함수인 det는 numpy 자체가 아니라 numpy 내부 패키지인 linalg 내에 속해있으므로,

np.det 대신 np.linalg.det 혹은 np.linalg를 LA로 불러와 LA.det 형태로 불러오셔야 합니다.

 

LA.det의 사용법은 LA.det(배열)처럼만 사용해주면되기에 매우 간단합니다.

 

다만, 정방행렬이 아닌 경우는 사용이 불가능하므로 이 점에 유의해주시길 바랍니다.

import numpy.linalg as LA

d = np.array([[1, 0],
              [0, 1]])

LA.det(d) # 1.0

e = np.array([[1, 0, 0],
              [0, 1, 0]])

LA.det(e) # LinAlgError: Last 2 dimensions of the array must be square

 

3차원 이상 배열의 경우

trace 함수와 마찬가지로, det 함수도 3차원 이상의 고차원 배열에 대해서

마지막 2 axis를 기준으로 각 내부 행렬에 대한 행렬식 계산을 지원합니다.

 

다만, 이 경우에도 각 내부 배열들이 정사각행렬이라는 조건을 만족해야합니다.

f = np.array([[[1, 2],
              [3, 4]],
              
              [[1, 0],
               [0, 1]]])

LA.det(f) # array([-2.,  1.])

1, 2, 3, 4로 구성된 행렬에 대한 행렬식인 -2와

단위행렬에 대한 det 값인 1이 모아져서 배열로 반환된 모습을 확인할 수 있었습니다.