소개
이 챌린지는 텐서 연산을 위한 강력하고 다재다능한 함수인 numpy.einsum을 소개합니다. dot, trace, multiply와 같은 특정 함수를 호출하는 대신, einsum을 사용하면 간단한 문자열 기반 표기법을 사용하여 이러한 연산 및 그 이상의 연산을 정의할 수 있습니다. 이 챌린지를 완료함으로써 일반적이고 복잡한 배열 조작에 einsum을 사용하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
작업 1: 행렬 곱셈
행렬 곱셈은 선형 대수학의 기본적인 연산입니다. 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
작업 2: 행렬의 대각합
정방 행렬의 대각합 (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
작업 3: 아다마르 곱 (Hadamard Product)
아다마르 곱 (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
작업 4: 텐서 축약 (Tensor Contraction)
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) 를 활용하는 능력을 보여줍니다.



