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

파이썬 NumPy einsum()으로 아인슈타인 합 규약 기반 행렬 대각선 추출하기

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' 표기법은 대각선 추출뿐 아니라 전치, 내적, 외적 등 다양한 배열 연산에도 응용할 수 있어 매우 유용합니다.