You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:25:28