Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 텐서 방정식 풀기: numpy.linalg.tensorsolve() 활용 가이드

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()는 다차원 계수 텐서를 포함한 선형 방정식을 손쉽게 해결해 주는 강력한 도구입니다.