NumPy Einsum 函数

NumPyBeginner
立即练习

介绍

本次挑战将带你了解 numpy.einsum,一个强大且多功能的张量(tensor)运算函数。einsum 允许你使用简单的字符串表示法来定义点积(dot)、迹(trace)、乘法(multiply)等运算,以及更多其他运算。通过完成本次挑战,你将对如何使用 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 来计算两个矩阵 AB 的乘积,并返回结果。

需要编辑的文件

  • /home/labex/project/matmul.py

该文件已为你创建,内容如下:

import numpy as np

def matmul(A: np.ndarray, B: np.ndarray) -> np.ndarray:
    ## TODO: Perform matrix multiplication using Numpy's einsum function.
    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: Compute the trace of a matrix using Numpy's einsum function.
    pass

任务 3:Hadamard 乘积

Hadamard 乘积,也称为逐元素乘积,会创建一个新矩阵,其中每个元素是两个相同形状输入矩阵对应元素的乘积。对于两个形状为 $(m \times n)$ 的矩阵 $A$ 和 $B$,Hadamard 乘积 $C$ 的形状也是 $(m \times n)$,其中 $C_{ij} = A_{ij} \times B_{ij}$。此运算的 einsum 字符串为 ij,ij->ij

你的任务

请在 hadamard_product.py 文件中完成 hadamard_product 函数。此函数应使用 numpy.einsum 计算两个矩阵 AB 的逐元素乘积。

需要编辑的文件

  • /home/labex/project/hadamard_product.py

该文件已为你创建,内容如下:

import numpy as np

def hadamard_product(A: np.ndarray, B: np.ndarray) -> np.ndarray:
    ## TODO: Compute the Hadamard product of two matrices using Numpy's einsum function.
    pass

任务 4:张量收缩

当处理高维数组或张量时,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: Perform tensor contraction between two tensors using Numpy's einsum function.
    pass

总结

恭喜你完成了 NumPy Einsum 挑战!你已成功使用 einsum 执行了矩阵乘法、计算了矩阵迹、计算了 Hadamard 乘积以及执行了张量收缩。这证明了你能够利用爱因斯坦求和约定(Einstein summation notation)为复杂数组操作编写简洁、高效且易读的代码。

✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习✨ 查看解决方案并练习