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

Python NumPy einsum_path()로 einsum 표현식의 최저 비용 축소 순서 구하기

einsum 표현식에 대해 최저 비용의 축소(contraction) 순서를 구하려면 Python의 numpy.einsum_path() 메서드를 사용합니다. 첫 번째 매개변수인 subscripts는 합산에 사용할 아래첨자를 지정하며, 두 번째 매개변수인 operands는 연산에 사용될 배열입니다.

아인슈타인 합 규약(Einstein summation convention)을 활용하면 다차원 선형 대수 배열 연산 대부분을 매우 간결한 형태로 표현할 수 있습니다. 암시적(implicit) 모드에서 einsum은 이러한 값을 자동으로 계산합니다.

반면 명시적(explicit) 모드에서는 특정 아래첨자 레이블에 대한 합산을 비활성화하거나 강제할 수 있어, 고전적인 아인슈타인 합 연산으로 분류되지 않는 다양한 배열 연산도 유연하게 처리할 수 있습니다.

반환되는 경로(path) 정보는 입력 축소식의 어떤 항을 먼저 축소해야 하는지를 알려줍니다. 해당 축소의 결과는 축소 목록의 끝에 추가되며, 모든 중간 축소가 완료될 때까지 이 목록을 반복적으로 처리하면 됩니다.

단계별 진행

먼저 필요한 라이브러리를 임포트합니다.

import numpy as np

텐서를 생성합니다.

p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

einsum 표현식의 최저 비용 축소 순서를 얻으려면 numpy.einsum_path() 메서드를 호출합니다.

path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

경로 정보를 출력합니다.

print(path_info[0])
print(path_info[1])

전체 예제 코드

import numpy as np
np.random.seed(123)

# 텐서 생성
p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

# einsum 표현식의 최저 비용 축소 순서를 구하기 위해 numpy.einsum_path() 메서드 사용
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

# 경로 정보 출력
print(path_info[0])
print(path_info[1])

실행 결과

['einsum_path', (1, 2), (0, 1)]
  Complete contraction:  ij,jk,kl->il
         Naive scaling:  4
     Optimized scaling:  3
      Naive FLOP count:  1.200e+02
  Optimized FLOP count:  5.700e+01
   Theoretical speedup:  2.105
  Largest intermediate:  4.000e+00 elements
--------------------------------------------------------------------------
scaling                 current                   remaining
--------------------------------------------------------------------------
   3                 kl,jk->jl                  ij,jl->il
   3                 jl,ij->il                     il->il