Python에서 텐서 방정식(tensor equation)을 풀 때는 numpy.linalg.tensorsolve() 메서드를 사용합니다. 이 함수는 tensordot(a, x, axes=b.ndim)에서와 같이, 곱 연산 과정에서 x의 모든 인덱스가 a의 가장 오른쪽 인덱스들과 함께 합산된다는 것을 전제로 동작합니다.
tensorsolve() 매개변수 살펴보기
- a (첫 번째 매개변수): 방정식의 계수 텐서입니다. 형태(shape)는
b.shape + Q이며, 여기서 Q는 a의 가장 오른쪽 인덱스들로 구성된 하위 텐서의 형태를 담은 튜플로,prod(Q) == prod(b.shape)조건을 만족해야 합니다. - b (두 번째 매개변수): 방정식의 우변에 해당하는 텐서로, 어떤 형태든 자유롭게 지정할 수 있습니다.
- axis (세 번째 매개변수): 역연산을 수행하기 전에 a의 특정 축을 오른쪽으로 재배열할 때 사용하는 축입니다. 기본값은 None이며, 이 경우 별도의 재배열 없이 그대로 계산됩니다.
텐서 방정식을 푸는 단계
1단계. 먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
2단계. NumPy의 배열 생성 메서드를 사용해 두 개의 배열을 만듭니다.
arr1 = np.eye(2*3*4) arr1.shape = (2*3, 4, 2, 3, 4) arr2 = np.random.randn(2*3, 4)
3단계. 생성한 배열을 화면에 출력합니다.
print("Array1...\n",arr1)
print("\nArray2...\n",arr2)
4단계. 두 배열의 차원(ndim)을 확인합니다.
print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)
5단계. 두 배열의 형태(shape)를 확인합니다.
print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)
6단계. numpy.linalg.tensorsolve() 메서드를 호출하여 텐서 방정식을 풉니다.
print("\nResult...\n",np.linalg.tensorsolve(arr1, arr2))
전체 예제 코드
import numpy as np
# NumPy 배열 두 개 생성
arr1 = np.eye(2*3*4)
arr1.shape = (2*3, 4, 2, 3, 4)
arr2 = np.random.randn(2*3, 4)
# 배열 출력
print("Array1...\n",arr1)
print("\nArray2...\n",arr2)
# 두 배열의 차원 확인
print("\nDimensions of Array1...\n",arr1.ndim)
print("\nDimensions of Array2...\n",arr2.ndim)
# 두 배열의 형태(shape) 확인
print("\nShape of Array1...\n",arr1.shape)
print("\nShape of Array2...\n",arr2.shape)
# numpy.linalg.tensorsolve() 메서드로 텐서 방정식 풀기
print("\nResult...\n",np.linalg.tensorsolve(arr1, arr2))
실행 결과
첫 번째 배열(Array1)은 24×24 크기의 단위 행렬을 (6, 4, 2, 3, 4) 형태로 재구성한 것이므로 출력 분량이 매우 깁니다. 아래에서는 핵심 부분만 발췌하여 표시합니다.
Array1... [[[[[1. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]]] ... (24×24 단위 행렬이 (6, 4, 2, 3, 4) 형태로 출력됨, 중략) ... [[[[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 1.]]]]] Array2... [[ 0.31376716 0.63443741 0.58628101 0.62313096] [ 1.12528958 -1.18403238 -0.64663325 -0.24241201] [ 0.55598965 -2.00059925 -1.97946414 -1.72478953] [ 0.18976226 0.60572953 1.50157692 -2.4491463 ] [ 0.42461806 -2.17872016 0.49677904 -1.11634625] [-1.09074462 0.35475618 0.42474987 -1.34391368]] Dimensions of Array1... 5 Dimensions of Array2... 2 Shape of Array1... (6, 4, 2, 3, 4) Shape of Array2... (6, 4) Result... [[[ 0.31376716 0.63443741 0.58628101 0.62313096] [ 1.12528958 -1.18403238 -0.64663325 -0.24241201] [ 0.55598965 -2.00059925 -1.97946414 -1.72478953]] [[ 0.18976226 0.60572953 1.50157692 -2.4491463 ] [ 0.42461806 -2.17872016 0.49677904 -1.11634625] [-1.09074462 0.35475618 0.42474987 -1.34391368]]]
결과 해석
이 예제에서 arr1은 사실상 24×24 크기의 단위 행렬(identity matrix)을 (6, 4, 2, 3, 4) 형태로 재배열한 것입니다. 따라서 텐서 방정식 ax = b의 해 x는 우변 b(arr2)를 (2, 3, 4) 형태로 재구성한 결과와 동일하게 출력됩니다. 실제 실행 결과에서도 해가 arr2의 값들을 그대로 (2, 3, 4) 구조로 담고 있는 것을 확인할 수 있습니다. 이처럼 tensorsolve()는 다차원 계수 텐서를 포함한 선형 방정식을 손쉽게 해결해 주는 강력한 도구입니다.