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
相关产品推荐
相关产品推荐

