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

PyTorch中A[b, c]与A[b][c]赋值差异原因咨询

为什么PyTorch中A[b][c] +=1不生效而A[b,c] +=1正常工作?

这俩写法的核心区别在于索引返回的是原张量的视图还是副本,具体拆解如下:

1. A[b][c] += 1的无效原因

  • 第一步A[b]:当你用整数列表b做索引时,这属于PyTorch的高级索引,这种操作会返回原张量的副本(而非指向原数据的视图)。也就是说,A[b]得到的是一个新的3×20张量,它的内存和原张量A完全分开。
  • 第二步[c] +=1:你是对这个临时副本的第c列元素加1,修改的只是这个副本,原张量A根本没被触及。副本用完后就被垃圾回收了,所以打印A时还是全零状态。

你可以用这个代码验证A[b]是副本:

print(A[b].is_shared())  # 输出False,说明和原张量不共享内存

2. A[b,c] +=1的生效原因

这是联合高级索引,PyTorch会直接解析这个索引表达式,定位到原张量中(2,2)、(3,2)、(4,2)这三个具体位置,直接在原张量的内存上进行原地修改,所以修改会直接反映到A上,执行后能看到对应位置的值变成1。

简单总结:连续两次索引会先产生副本再修改,等于白忙活;一次联合索引直接操作原张量,才能达到预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:59:59