소개
이 챌린지는 텐서 연산을 위한 강력하고 다재다능한 함수인 numpy.einsum을 소개합니다. dot, trace, multiply와 같은 특정 함수를 호출하는 대신, einsum을 사용하면 간단한 문자열 기반 표기법을 사용하여 이러한 연산 및 그 이상의 연산을 정의할 수 있습니다. 이 챌린지를 완료함으로써 일반적이고 복잡한 배열 조작에 einsum을 사용하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
이 챌린지는 텐서 연산을 위한 강력하고 다재다능한 함수인 numpy.einsum을 소개합니다. dot, trace, multiply와 같은 특정 함수를 호출하는 대신, einsum을 사용하면 간단한 문자열 기반 표기법을 사용하여 이러한 연산 및 그 이상의 연산을 정의할 수 있습니다. 이 챌린지를 완료함으로써 일반적이고 복잡한 배열 조작에 einsum을 사용하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
행렬 곱셈은 선형 대수학의 기본적인 연산입니다. einsum을 사용하면 입력 배열의 인덱스가 어떻게 결합되어야 하는지를 정의하여 이 연산을 표현할 수 있습니다. 두 행렬 A (크기 m \times n) 와 B (크기 n \times p) 의 곱 C (크기 m \times p) 는 다음과 같이 정의됩니다. einsum 표기법에서는 ij,jk->ik로 표현됩니다. 반복되는 인덱스 j에 대해 합산이 수행됩니다.
matmul.py 파일에서 matmul 함수를 완성하십시오. 이 함수는 numpy.einsum을 사용하여 두 행렬 A와 B를 곱하고 결과를 반환해야 합니다.
/home/labex/project/matmul.py다음 내용으로 파일이 생성되었습니다:
import numpy as np
def matmul(A: np.ndarray, B: np.ndarray) -> np.ndarray:
## TODO: Numpy 의 einsum 함수를 사용하여 행렬 곱셈을 수행합니다.
pass
정방 행렬의 대각합 (trace) 은 주 대각선에 있는 요소들의 합입니다. einsum은 이 합계를 지정하는 매우 간결한 방법을 제공합니다. 행렬 A에서 대각선 요소는 행 인덱스와 열 인덱스가 같은 요소들 (A_{ii}) 입니다. 이 연산을 위한 einsum 문자열은 ii->입니다. 반복되는 인덱스 i는 합산을 나타내며, 비어있는 출력은 결과가 스칼라임을 의미합니다.
trace_of_matrix.py 파일에서 trace 함수를 완성하십시오. numpy.einsum을 사용하여 주어진 정방 행렬 A의 대각합을 계산하십시오.
/home/labex/project/trace_of_matrix.py다음 내용으로 파일이 생성되었습니다:
import numpy as np
def trace(A: np.ndarray) -> float:
## TODO: Numpy 의 einsum 함수를 사용하여 행렬의 대각합을 계산합니다.
pass
아다마르 곱 (Hadamard product) 또는 요소별 곱셈은 두 개의 동일한 모양을 가진 입력 행렬에서 해당 요소들의 곱으로 이루어진 새로운 행렬을 생성합니다. 모양이 (m \times n)인 두 행렬 A와 B에 대해, 아다마르 곱 C 역시 모양이 (m \times n)이며, C_{ij} = A_{ij} \times B_{ij}입니다. 이 연산을 위한 einsum 문자열은 ij,ij->ij입니다.
hadamard_product.py 파일에서 hadamard_product 함수를 완성하십시오. 이 함수는 numpy.einsum을 사용하여 두 행렬 A와 B의 요소별 곱셈을 계산해야 합니다.
/home/labex/project/hadamard_product.py다음 내용으로 파일이 생성되었습니다:
import numpy as np
def hadamard_product(A: np.ndarray, B: np.ndarray) -> np.ndarray:
## TODO: Numpy 의 einsum 함수를 사용하여 두 행렬의 아다마르 곱을 계산합니다.
pass
einsum은 고차원 배열, 즉 텐서를 다룰 때 진가를 발휘합니다. 텐서 축약은 행렬 곱셈을 일반화한 것입니다. 이 작업에서는 모양이 (m \times n \times p)인 3D 텐서 A와 모양이 (p \times q)인 2D 행렬 B를 축약합니다. 목표는 공유되는 차원 p에 대해 합계를 계산하여 모양이 (m \times n \times q)인 새로운 텐서를 얻는 것입니다. 이 연산을 위한 einsum 문자열은 ijk,kl->ijl입니다.
tensor_contract.py 파일에서 tensor_contract 함수를 완성하십시오. numpy.einsum을 사용하여 3D 텐서 A와 2D 행렬 B 간의 축약을 수행하십시오.
/home/labex/project/tensor_contract.py다음 내용으로 파일이 생성되었습니다:
import numpy as np
def tensor_contract(A: np.ndarray, B: np.ndarray) -> np.ndarray:
## TODO: Numpy 의 einsum 함수를 사용하여 두 텐서 간의 텐서 축약을 수행합니다.
pass
NumPy Einsum 챌린지를 성공적으로 완료하신 것을 축하드립니다! 행렬 곱셈 수행, 행렬 대각합 (trace) 계산, 아다마르 곱 (Hadamard product) 계산, 그리고 텐서 축약 (tensor contraction) 을 위해 einsum을 성공적으로 사용하셨습니다. 이는 복잡한 배열 연산을 위한 간결하고 효율적이며 가독성 높은 코드를 작성하는 데 아인슈타인 합 기호 (Einstein summation notation) 를 활용하는 능력을 보여줍니다.