파이썬에서 아인슈타인 합산 규약(Einstein summation convention)을 활용해 벡터의 외적(outer product)을 계산하려면 numpy.einsum() 메서드를 사용하면 됩니다. 첫 번째 매개변수는 아래첨자(subscript)로, 합산에 사용할 아래첨자 레이블을 쉼표로 구분한 목록 형태로 지정합니다. 두 번째 매개변수는 피연산자(operands)로, 연산에 사용될 배열들을 의미합니다.
einsum() 메서드란?
einsum() 메서드는 피연산자에 대해 아인슈타인 합산 규약을 평가합니다. 이 규약을 사용하면 내적, 외적, 행렬 곱, 전치 등 다차원 배열과 관련된 수많은 선형 대수 연산을 매우 간결한 표기법 하나로 표현할 수 있습니다.
- 암시적 모드(Implicit mode): einsum이 아래첨자 패턴을 해석해 자동으로 값을 계산합니다.
- 명시적 모드(Explicit mode): 특정 아래첨자 레이블에 대한 합산을 비활성화(
->표기)하거나 강제함으로써, 고전적인 아인슈타인 합산으로 분류되지 않는 다양한 배열 연산도 유연하게 수행할 수 있습니다.
단계별 구현 방법
1단계: 라이브러리 임포트
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
2단계: 넘파이 배열 생성
arange() 메서드를 사용해 넘파이 배열을 생성합니다.
arr = np.arange(5)
3단계: 배열 정보 확인
생성된 배열을 출력합니다.
print("Our Array...\n",arr)배열의 차원을 확인합니다.
print("\nDimensions of our Array...\n",arr.ndim)배열의 데이터 타입을 확인합니다.
print("\nDatatype of our Array object...\n",arr.dtype)배열의 형상(shape)을 확인합니다.
print("\nShape of our Array object...\n",arr.shape)4단계: einsum()으로 외적 계산
아인슈타인 합산 규약으로 벡터 외적을 계산합니다. 여기서 'i,j'처럼 공통 인덱스가 없는 아래첨자를 지정하면 합산이 일어나지 않고, 두 배열 요소의 모든 조합에 대한 곱이 계산되어 외적 결과가 만들어집니다.
print("\nResult (outer product)...\n",np.einsum('i,j', np.arange(2)+1, arr))전체 예제 코드
import numpy as np
# arange() 메서드로 넘파이 배열 생성
arr = np.arange(5)
# 배열 출력
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)
# 아인슈타인 합산 규약으로 벡터 외적 계산
print("\nResult (outer product)...\n",np.einsum('i,j', np.arange(2)+1, arr))실행 결과
Our Array... [0 1 2 3 4] Dimensions of our Array... 1 Datatype of our Array object... int64 Shape of our Array object... (5,) Result (outer product)... [[0 1 2 3 4] [0 2 4 6 8]]
결과 해석
np.arange(2)+1은 [1, 2] 배열을 생성하고, arr은 [0 1 2 3 4]입니다. 아래첨자 'i,j'는 두 인덱스가 서로 독립적이므로 합산 없이 모든 조합의 곱이 계산되며, 그 결과 크기가 2×5인 외적 행렬이 출력됩니다. 이처럼 einsum()을 활용하면 별도의 전용 함수 없이도 외적을 포함한 다양한 텐서 연산을 직관적인 표기법으로 처리할 수 있습니다.