はじめに
このチャレンジでは、テンソル演算のための強力で汎用性の高い関数である numpy.einsum を紹介します。dot、trace、multiply のような特定の関数を呼び出す代わりに、einsum を使用すると、単純な文字列ベースの表記法でこれらの操作などを定義できます。このチャレンジを完了することで、一般的および複雑な配列操作に einsum を使用する方法をしっかりと理解できるようになります。
このチャレンジでは、テンソル演算のための強力で汎用性の高い関数である numpy.einsum を紹介します。dot、trace、multiply のような特定の関数を呼び出す代わりに、einsum を使用すると、単純な文字列ベースの表記法でこれらの操作などを定義できます。このチャレンジを完了することで、一般的および複雑な配列操作に einsum を使用する方法をしっかりと理解できるようになります。
行列乗算は、線形代数における基本的な演算です。einsum を使用すると、入力配列のインデックスがどのように組み合わされるかを定義することで、この演算を表現できます。2 つの行列 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
正方行列のトレースは、その主対角線上の要素の合計です。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
アダマール積、または要素ごとの積は、同じ形状を持つ 2 つの入力行列の対応する要素の積からなる新しい行列を作成します。形状が (m \times n) の 2 つの行列 A と B に対して、アダマール積 C も形状 (m \times n) となり、C_{ij} = A_{ij} \times B_{ij} となります。この操作の einsum 文字列は ij,ij->ij です。
hadamard_product.py ファイル内の hadamard_product 関数を完成させてください。この関数は、numpy.einsum を使用して、2 つの行列 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 関数を使用して 2 つの行列のアダマール積を計算します。
pass
einsum は、高次元配列(テンソル)を扱う際に真価を発揮します。テンソル縮約は行列積の一般化です。このタスクでは、形状が (m \times n \times p) の 3 次元テンソル A と、形状が (p \times q) の 2 次元行列 B を縮約します。目的は、共通の次元 p について合計を取り、形状が (m \times n \times q) の新しいテンソルを生成することです。この操作の einsum 文字列は ijk,kl->ijl です。
tensor_contract.py ファイル内の tensor_contract 関数を完成させてください。numpy.einsum を使用して、3 次元テンソル A と 2 次元行列 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 関数を使用して 2 つのテンソル間のテンソル縮約を実行します。
pass
NumPy Einsum チャレンジの完了、おめでとうございます!行列積の実行、行列トレースの計算、アダマール積の計算、テンソル縮約の実行に einsum を使用することに成功しました。これにより、複雑な配列操作に対して、簡潔で効率的、かつ読みやすいコードを書くためにアインシュタインの縮約記法を使用する能力が証明されました。