Python/Numpy

[Numpy] 파이썬 eigenvalue, eigenvector 구하기 : np.linalg.eig

jimmy_AI 2022. 9. 27. 00:03
반응형

Python에서 주어진 배열의 고윳값(eigenvalue)와 고유벡터(eigenvector)를

쉽게 찾을 수 있는 넘파이 모듈 내 eig 함수에 대하여 사용법 예제를 살펴보겠습니다.

 

 

np.linalg.eig 함수 기본 사용법

(n, n) 형태의 shape를 가지는 2차원 정방행렬에 대하여

np.linalg.eig(행렬) 형태로 바로 적용해주시면 됩니다.

 

output은 eigenvalue를 모은 리스트, eigenvector를 모은 행렬 순서로 반환되며

각 i번째 고유값에 해당하는 고유벡터는의 i번째 열벡터에 해당되는 점을 참고해주세요.

import numpy as np

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

A_eig_val, A_eig_vec = np.linalg.eig(A)

print(A_eig_val)
print(A_eig_vec)

매칭되는 eigenvalue - eigenvector끼리 색으로 구분

 

 

3차원 이상 배열의 경우

3차원 이상의 다차원 배열의 경우라도 마지막 두 차원이 정방행렬이라면

마찬가지로 eig 메소드 적용이 가능합니다.

 

반응형

 

이 경우에는 마지막 2-dimension에 해당하는 각 내부 행렬을 기준으로

고유값 및 고유벡터를 모아서 반환하게 됩니다.

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

B_eig_val, B_eig_vec = np.linalg.eig(B)

print("각 배열의 고윳값")
print(B_eig_val)

print("각 배열의 고유벡터")
print(B_eig_vec)

1번 배열 : 빨강/주황, 2번 배열 : 파랑/하늘색으로 구분하여 결과를 표현

 

 

특수한 경우(정방행렬이 아닌 경우, 역행렬 미존재)

마지막 2개의 차원이 정방행렬이 아닌 경우에는 고윳값 및 고유벡터를

정의할 수 없어 아래의 경우처럼 LinAlgError 오류가 발생합니다.

 

다만, 역행렬이 존재하지 않는 정방행렬의 경우라도 0을 고유값으로 가지면서

정의가 가능하므로 이 경우에는 eig 함수 적용이 가능합니다.

### 정방행렬이 아닌 경우 ###
C = np.array([[1, 0, 3],
              [2, 1, 4]])

C_eig_val, C_eig_vec = np.linalg.eig(C) # LinAlgError: Last 2 dimensions of the array must be square


### Singular Matrix(역행렬 미존재)인 경우 ###
D = np.array([[1, 0],
              [2, 0]])

D_eig_val, D_eig_vec = np.linalg.eig(D)

print(D_eig_val) # [0. 1.]
print(D_eig_vec)
# 결과
[[0.         0.4472136 ]
 [1.         0.89442719]]