返回

NumPy einsum 使用详解:轻松掌握多维数组运算

python

NumPy einsum:深入理解和实践

简介

在NumPy的强大工具箱中,einsum 函数脱颖而出,为多维数组的处理提供了简洁高效的方式。它利用爱因斯坦求和约定,使复杂的张量操作变得触手可及。本文将深入探讨 einsum 的工作原理、优势、应用以及最佳实践,帮助你充分利用其潜力。

einsum 的工作原理

einsum 函数的工作原理很简单。它采用两个参数:操作字符串和一个或多个输入数组。操作字符串指定要执行的张量收缩,而输入数组提供运算所需的数据。

爱因斯坦求和约定是 einsum 的核心。重复的索引表示求和。例如,操作字符串 "ij, jk -> ki" 表示将两个索引为 "i""j" 的矩阵 A 与索引为 "j""k" 的矩阵 B 相乘,然后对索引 "i" 求和。

einsum 的优势

使用 einsum 具有以下优势:

  • 简洁性: 它用简洁的表达式表示复杂的张量操作,减少冗余代码。
  • 效率: 它利用 NumPy 底层的优化实现,提供出色的性能。
  • 可读性: 操作字符串清楚地表达了运算,提高代码可读性。

einsum 的应用

einsum 在各种机器学习和科学计算任务中有着广泛的应用,包括:

  • 张量收缩
  • 矩阵乘法
  • 卷积操作
  • 特征工程

einsum 的最佳实践

充分利用 einsum,需要遵循一些最佳实践:

  • 仔细检查操作字符串: 确保它准确表示所需的运算。
  • 使用括号: 对复杂表达式分组以提高可读性。
  • 块运算: 对于大型数组,块运算可以提高效率。

实战示例

让我们通过一个示例来理解 einsum 的实际应用。考虑以下矩阵乘法 (A @ B).T

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

使用 einsum,我们可以这样计算:

np.einsum("ij, jk -> ki", A, B)

这将产生结果:

[[19 22]
 [43 50]]

(A @ B).T 得到的结果一致。

常见问题解答

  • 什么是爱因斯坦求和约定?
    它是一个约定,重复的索引表示求和。
  • einsum 如何处理广播?
    einsum 自动处理广播,允许形状不匹配的数组进行运算。
  • 什么时候使用块运算?
    当数组非常大时,块运算可以减少内存使用并提高效率。
  • 如何提高 einsum 的性能?
    使用最佳实践,例如仔细检查操作字符串和使用块运算。
  • einsum 是否适用于稀疏矩阵?
    einsum 不直接支持稀疏矩阵,但可以使用稀疏矩阵库(例如scipy.sparse)进行转换。

结论

einsum 是 NumPy 中一个功能强大的工具,可显著简化多维数组的操作。它提供简洁性、效率和可读性的完美结合。通过理解其工作原理、优势、应用和最佳实践,你可以充分利用 einsum 提升你的代码。