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

如何理解PyTorch中cc[bb] += aa代码的运行结果及原理?

PyTorch 中cc[bb] += aa执行逻辑与结果解释

首先逐行确认各张量的实际值与形状:

  • 执行aa=torch.tensor([[1,2,3],[4,5,6]]).T:原输入张量是2行3列,转置后得到3行2列的张量aa,实际值为:
    tensor([[1, 4],
            [2, 5],
            [3, 6]])
    
  • 执行bb=torch.tensor([0,1,1]).T:一维张量转置不改变形状,最终bb是长度为3的一维张量,值为[0,1,1],作为索引使用。
  • 执行cc = torch.zeros(2, 2):初始化得到2行2列的全0张量,初始所有元素值为0。

cc[bb] += aa的具体执行步骤

结果和直觉里的「重复索引位置累加」不一致,核心原因是张量的整数数组高级索引返回的是原张量的副本,不是视图,整个+=操作会拆成三个独立步骤执行,不会在原张量上做原地累加:

  1. 索引取值:用bb作为第一维(行维度)的索引取cc的元素。bb长度为3,索引值分别是0、1、1,因此会取出一个形状为(3,2)的临时副本张量,初始值全为0(因为cc初始全0)。
  2. 加法运算:将临时副本张量和形状完全匹配的aa做逐元素相加,相加后临时张量的值和aa完全一致:
    tensor([[1, 4],  # 对应bb[0]=0,要写回cc的第0行
            [2, 5],  # 对应bb[1]=1,要写回cc的第1行
            [3, 6]]) # 对应bb[2]=1,要写回cc的第1行
    
  3. 索引赋值:把临时张量的每一行,按bb对应的行号逐行写回cc。当同一个cc位置被多次索引时,后面的写入会直接覆盖前面的结果,不会做累加:
    • 先写第0行:把临时张量第0行[1,4]写入cc第0行,此时cc值为[[1,4],[0,0]]
    • 再写第1行第一次:把临时张量第1行[2,5]写入cc第1行,此时cc值为[[1,4],[2,5]]
    • 最后写第1行第二次:把临时张量第2行[3,6]写入cc第1行,直接覆盖之前的[2,5],最终cc值为[[1,4],[3,6]],和运行结果完全一致。

注意区分切片索引和高级索引的差异:如果是切片索引,返回的是原张量的视图,+=会直接在原张量上做原地运算,重复索引位置会累加;但整数数组类的高级索引返回的是副本,走上述副本计算后逐位写回逻辑,重复位置后写入的值会覆盖之前的结果,不会累加。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:42:31