如何用numpy.einsum实现未知数量操作数的矩阵-向量链式乘法?
高效实现任意数量矩阵-向量的链式乘法
当你需要处理任意数量N的矩阵与初始向量的链式乘法时,numpy.einsum确实会因为标签数量限制(仅支持52个大小写字母)和动态生成下标字符串的繁琐性而受限。这里有两种更高效且无限制的替代方案:
方案1:先合并矩阵再乘向量
利用矩阵乘法的结合律,先将所有矩阵通过numpy.linalg.multi_dot合并为一个单一矩阵,再与初始向量相乘。multi_dot会自动选择最优的乘法顺序,比手动循环连乘更高效。
代码示例:
import numpy as np # 假设matrices是存储所有待乘矩阵的列表,v是初始向量 if not matrices: result = v.copy() else: # 合并所有矩阵为一个大矩阵 combined_mat = np.linalg.multi_dot(matrices) # 计算最终结果 result = combined_mat @ v
方案2:迭代式矩阵-向量相乘
如果矩阵规模较大、合并矩阵会占用过多内存,可以选择迭代计算:每次用当前矩阵乘上一轮的向量结果,逐步得到最终输出。
代码示例:
import numpy as np result = v.copy() # 遍历所有矩阵,依次与当前向量相乘 for mat in matrices: result = mat @ result
这两种方案都不存在einsum的标签数量限制,且完全基于numpy的原生优化操作,性能表现更稳定。
内容的提问来源于stack exchange,提问作者SimoneGasperini
相关产品推荐
相关产品推荐

