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

numpy.tensordot指定axes参数时的计算逻辑与结果复现方法

numpy.tensordot axes=(0,1)参数的计算规则

核心逻辑

tensordot的本质是对指定的两个轴做逐元素乘积后求和(也就是向量点积操作),剩余的轴按「A剩余轴在前,B剩余轴在后」的顺序拼接为输出张量的轴。
你对输出shape的判断是正确的,我们先把两个张量的索引规则明确:

  • 你的A reshape后shape为(2,3,2),索引可写为A[a0, a1, a2],各索引取值范围:
    • a0(第0轴,指定要收缩的轴):0、1(长度2)
    • a1(第1轴,保留):0、1、2(长度3)
    • a2(第2轴,保留):0、1(长度2)
  • 你的B reshape后shape为(3,2,2),索引可写为B[b0, b1, b2],各索引取值范围:
    • b0(第0轴,保留):0、1、2(长度3)
    • b1(第1轴,指定要收缩的轴):0、1(长度2,和A的a0轴长度匹配,满足收缩要求)
    • b2(第2轴,保留):0、1(长度2)
      对应到你的参数axes=(0,1),输出C的索引为C[a1,a2,b0,b2],shape就是(3,2,3,2),和你运行得到的shape完全一致。
      C中每个元素的计算公式固定为:
C[a1,a2,b0,b2] = sum_{k=0到1} (A[k, a1, a2] * B[b0, k, b2])

也就是遍历被收缩轴的所有索引k,把两个张量对应位置的元素相乘,最后把所有乘积加起来,就是C对应位置的值。

计算误区和结果验证

你之前误以为C的第一个块是「A的两个矩阵乘B第一个矩阵的第一列」,本质是搞混了B的收缩轴位置:B被收缩的是第1轴(也就是每个B[b0]子矩阵的行维度),不是第0轴。
我们先看你说的第一个全0块,对应a1=0,a2=0的所有b0、b2取值:
A中A[k,0,0]的值为:k=0时取0,k=1时取0,不管B对应位置取什么值,两个乘积都是0,求和结果自然全为0,和你打印的第一个全0块完全匹配。
再举几个你打印结果里的非0值手动验证:

  1. 取C[0,1,0,0](a1=0,a2=1,b0=0,b2=0):
    • k=0: A[0,0,1] = 1,B[0,0,0] = 1 → 乘积1*1=1
    • k=1: A[1,0,1] = 1,B[0,1,0] = 0 → 乘积1*0=0
    • 求和结果1,和打印值一致
  2. 取C[1,0,1,0](a1=1,a2=0,b0=1,b2=0):
    • k=0: A[0,1,0] =1,B[1,0,0] =1 → 乘积1*1=1
    • k=1: A[1,1,0] =1,B[1,1,0] =1 → 乘积1*1=1
    • 求和结果2,和打印值一致
  3. 取C[1,1,2,1](a1=1,a2=1,b0=2,b2=1):
    • k=0: A[0,1,1] =0,B[2,0,1] =0 → 乘积0*0=0
    • k=1: A[1,1,1] =1,B[2,1,1] =1 → 乘积1*1=1
    • 求和结果1,和打印值一致
      所有输出值都完全符合上述计算规则。

内容的提问来源于stack exchange,提问作者Debbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:24:26