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

파이썬 NumPy einsum()으로 벡터 내적 계산하기 – 아인슈타인 합 규약 완벽 가이드

아인슈타인 합 규약(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()을 활용하면 내적뿐만 아니라 외적, 행렬 곱, 전치 등 다양한 배열 연산을 직관적인 첨자 표기법으로 손쉽게 구현할 수 있습니다.