Python에서 여러 개의 행렬이 쌓여 있는(stacked) 배열에 대해 무어-펜로즈(Moore-Penrose) 의사역행렬(pseudo-inverse)을 계산하려면 numpy.linalg.pinv() 메서드를 사용하면 됩니다. 이 메서드는 특잇값 분해(SVD, Singular Value Decomposition)를 기반으로 행렬의 일반화된 역행렬을 계산하며, 크기가 충분히 큰 특잇값만 사용합니다.
각 매개변수는 다음과 같습니다.
- a: 의사역행렬을 구할 대상 행렬 또는 행렬 스택입니다.
- rcond: 작은 특잇값에 대한 컷오프(cutoff) 값입니다. 최대 특잇값 × rcond 이하의 특잇값은 0으로 처리되며, 행렬 스택 전체에 브로드캐스팅됩니다.
- hermitian: True로 설정하면 입력 행렬 a가 에르미트(Hermitian) 행렬이라고 가정하여, 더 효율적인 방법으로 특잇값을 계산합니다. 기본값은 False입니다.
단계별 진행 과정
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
array() 함수를 사용해 배열을 생성합니다.
arr = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
생성한 배열을 출력해 확인합니다.
print("Our Array...\n",arr)배열의 차원 수(ndim)를 확인합니다.
print("\nDimensions of our Array...\n",arr.ndim)배열의 데이터 타입(dtype)을 확인합니다.
print("\nDatatype of our Array object...\n",arr.dtype)배열의 형태(shape)를 확인합니다.
print("\nShape of our Array object...\n",arr.shape)numpy.linalg.pinv() 메서드를 호출하여 행렬 스택의 무어-펜로즈 의사역행렬을 계산합니다.
print("\nResult...\n",np.linalg.pinv(arr))전체 예제 코드
import numpy as np
# array() 함수로 배열 생성
arr = np.array([ [[1, 2], [3, 4]], [[1, 2], [2, 1]], [[1, 3], [3, 1]] ])
# 배열 출력
print("Our Array...\n",arr)
# 차원 수 확인
print("\nDimensions of our Array...\n",arr.ndim)
# 데이터 타입 확인
print("\nDatatype of our Array object...\n",arr.dtype)
# 형태 확인
print("\nShape of our Array object...\n",arr.shape)
# numpy.linalg.pinv()로 행렬 스택의 무어-펜로즈 의사역행렬 계산
print("\nResult...\n",np.linalg.pinv(arr))실행 결과
Our Array... [[[1 2] [3 4]] [[1 2] [2 1]] [[1 3] [3 1]]] Dimensions of our Array... 3 Datatype of our Array object... int64 Shape of our Array object... (3, 2, 2) Result... [[[-2. 1. ] [ 1.5 -0.5 ]] [[-0.33333333 0.66666667] [ 0.66666667 -0.33333333]] [[-0.125 0.375 ] [ 0.375 -0.125 ]]]