아인슈타인 합 규약(Einstein Summation Convention)을 활용해 벡터의 내적(inner product)을 계산하려면 파이썬의 numpy.einsum() 메서드를 사용하면 됩니다.
einsum() 메서드는 두 개의 주요 매개변수를 받습니다.
- 첫 번째 매개변수 – 첨자(subscript): 쉼표로 구분된 첨자 레이블 목록 형태로, 어떤 축(axis)에 대해 합산을 수행할지 지정합니다.
- 두 번째 매개변수 – 피연산자(operands): 연산에 사용될 배열들입니다.
einsum()은 피연산자에 대해 아인슈타인 합 규약을 평가하는 함수로, 다차원 선형대수 배열 연산 대부분을 매우 간결한 표현식 하나로 나타낼 수 있다는 것이 큰 장점입니다.
암시적 모드와 명시적 모드
암시적 모드(Implicit Mode)에서는 einsum이 지정된 첨자에 따라 자동으로 값을 계산합니다. 반면 명시적 모드(Explicit Mode)에서는 특정 첨자 레이블에 대한 합산을 비활성화하거나 강제할 수 있어, 고전적인 아인슈타인 합 연산 범주에 속하지 않는 다양한 배열 연산까지 유연하게 처리할 수 있습니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import numpy as np
arange() 메서드를 사용해 넘파이 배열을 생성합니다.
arr = np.arange(4)
생성된 배열을 화면에 출력해 확인합니다.
print("Our Array...\n",arr)배열의 차원(dimension)을 확인합니다.
print("\nDimensions of our Array...\n",arr.ndim)배열 객체의 데이터 타입(dtype)을 확인합니다.
print("\nDatatype of our Array object...\n",arr.dtype)배열의 형상(shape)을 확인합니다.
print("\nShape of our Array object...\n",arr.shape)아인슈타인 합 규약으로 벡터의 내적을 계산하려면 numpy.einsum() 메서드에 'i,i' 첨자를 전달합니다. 동일한 레이블 i가 두 배열에 사용되었고 출력 레이블이 없으므로, 해당 축을 따라 요소별 곱셈 후 합산이 수행됩니다.
print("\nResult (inner product)...\n",np.einsum('i,i', arr, arr))전체 예제 코드
import numpy as np
# arange() 메서드로 넘파이 배열 생성
arr = np.arange(4)
# 배열 출력
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)
# einsum()으로 벡터 내적 계산
print("\nResult (inner product)...\n",np.einsum('i,i', arr, arr))실행 결과
Our Array... [0 1 2 3] Dimensions of our Array... 1 Datatype of our Array object... int64 Shape of our Array object... (4,) Result (inner product)... 14
위 결과에서 볼 수 있듯이, 배열 [0 1 2 3]의 내적은 0×0 + 1×1 + 2×2 + 3×3 = 14로 계산됩니다. 이처럼 einsum()을 활용하면 내적뿐만 아니라 외적, 행렬 곱, 전치 등 다양한 배열 연산을 직관적인 첨자 표기법으로 손쉽게 구현할 수 있습니다.