如何在Python中不使用for循环实现对应张量矩阵相乘?
对应矩阵元素相乘的无循环实现方案
你需要的是让数组X和Y中对应位置的矩阵做乘法(即第i个矩阵相乘),不用for循环的话,有几种直接的numpy实现方式:
方法1:用np.einsum(灵活可控)
einsum可以精准定义张量运算规则,刚好适配这种按索引匹配的矩阵乘法:
import numpy as np # 假设X、Y的形状是(3, 3, 3)——3个3×3矩阵 Z = np.einsum('ijk,ikl->ijl', X, Y)
简单解释:ijk对应X的维度(第一个维度是矩阵的索引,后两个是矩阵的行、列),ikl对应Y的维度,ijl指定输出格式——对每个索引i,计算X[i]和Y[i]的矩阵乘积,最终得到的Z就是[AD, BE, CF]对应的数组。
方法2:用np.matmul或@运算符(简洁直观)
numpy的矩阵乘法函数matmul和Python 3.5+支持的@运算符都支持广播特性:当两个数组的前N-2维完全匹配时,会自动对对应位置的矩阵做乘法:
# 两种写法效果完全一致 Z = np.matmul(X, Y) # 或者更简洁的 Z = X @ Y
如果X、Y的形状是(3, 3, 3),这两行代码都会自动执行X[0]@Y[0]、X[1]@Y[1]、X[2]@Y[2],直接得到目标数组Z。
为什么tensordot不行?
你之前用的np.tensordot(X, Y, axis=1)是把X的第二个维度和Y的第一个维度做内积,这相当于计算了所有X[i]和Y[j]的乘积组合(i、j遍历0-2),所以得到的是包含9个乘积的二维数组结构,这不是我们要的“对应位置相乘”逻辑。
内容的提问来源于stack exchange,提问作者Thomas Ho
相关产品推荐
相关产品推荐

