NumPy의 einsum() 메서드는 피연산자(operand)에 대해 아인슈타인 합 규약(Einstein summation convention)을 평가하는 강력한 도구입니다. 이 규약을 활용하면 다차원 배열에 대한 다양한 선형대수 연산을 매우 간결한 표기법으로 나타낼 수 있습니다.
암시적 모드와 명시적 모드
einsum()은 두 가지 모드로 동작합니다. 암시적 모드(implicit mode)에서는 아인슈타인 합 규약에 따라 자동으로 값을 계산합니다. 반면 명시적 모드(explicit mode)에서는 특정 첨자(subscript) 레이블에 대한 합산을 비활성화하거나 강제할 수 있어, 고전적인 아인슈타인 합 연산으로 분류되지 않는 다른 배열 연산도 유연하게 수행할 수 있습니다.
행렬의 대각선(diagonal) 요소를 추출하려면 아인슈타인 합 규약과 함께 파이썬의 numpy.einsum() 메서드를 사용하면 됩니다.
주요 매개변수
- subscripts (첫 번째 매개변수): 합산에 사용될 첨자를 쉼표로 구분된 첨자 레이블 목록 형태로 지정합니다.
- operands (두 번째 매개변수): 연산의 대상이 되는 배열입니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
arange()와 reshape() 메서드를 사용해 4x4 크기의 NumPy 배열을 생성합니다.
arr = np.arange(16).reshape(4,4)
생성된 배열을 화면에 출력합니다.
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)아인슈타인 합 규약으로 행렬의 대각선을 추출하려면 numpy.einsum() 메서드를 사용합니다. 여기서 'ii->i'는 동일한 인덱스 i를 가진 대각선 요소만 선택한다는 의미입니다.
print("\nResult...\n",np.einsum('ii->i', arr))전체 예제 코드
import numpy as np
# arange()와 reshape() 메서드로 NumPy 배열 생성
arr = np.arange(16).reshape(4,4)
# 배열 출력
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)
# 아인슈타인 합 규약으로 행렬의 대각선 추출
print("\nResult...\n",np.einsum('ii->i', arr))실행 결과
Our Array... [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] Dimensions of our Array... 2 Datatype of our Array object... int64 Shape of our Array object... (4, 4) Result... [ 0 5 10 15]
실행 결과를 보면 4x4 행렬에서 왼쪽 위부터 오른쪽 아래까지의 대각선 요소인 [0, 5, 10, 15]가 성공적으로 추출된 것을 확인할 수 있습니다. 이처럼 einsum()의 'ii->i' 표기법은 대각선 추출뿐 아니라 전치, 내적, 외적 등 다양한 배열 연산에도 응용할 수 있어 매우 유용합니다.