为何修改NumPy数组时,部分操作会同步改变转换后的PyTorch Tensor?
NumPy数组与PyTorch Tensor转换后的同步修改差异
当将NumPy数组转换为PyTorch Tensor后,不同修改方式会导致Tensor值是否同步变化,示例如下:
初始状态
import numpy as np import torch array = np.arange(1., 8.) tensor = torch.from_numpy(array) array, tensor
输出:
(array([1., 2., 3., 4., 5., 6., 7.]), tensor([1., 2., 3., 4., 5., 6., 7.], dtype=torch.float64))
原地修改:Tensor同步变化
array = np.arange(1., 8.) tensor = torch.from_numpy(array) array += 1 array, tensor
输出:
(array([2., 3., 4., 5., 6., 7., 8.]), tensor([2., 3., 4., 5., 6., 7., 8.], dtype=torch.float64))
重新赋值:Tensor不变化
array = np.arange(1., 8.) tensor = torch.from_numpy(array) array = array + 1 array, tensor
输出:
(array([2., 3., 4., 5., 6., 7., 8.]), tensor([1., 2., 3., 4., 5., 6., 7.], dtype=torch.float64))
重新赋值后再原地修改:Tensor仍不变化
array = np.arange(1., 8.) tensor = torch.from_numpy(array) array = array + 1 array += 1 array, tensor
输出:
(array([3., 4., 5., 6., 7., 8., 9.]), tensor([1., 2., 3., 4., 5., 6., 7.], dtype=torch.float64))
原因解析
核心在于内存共享机制和两种赋值操作的本质差异:
torch.from_numpy()(以及反向的tensor.numpy())默认让Tensor和NumPy数组共享同一块内存空间,而非创建数据副本。array += 1是原地修改操作:直接在原数组的内存地址中更新数值,没有改变array变量的指向,因此共享内存的Tensor会同步读取到新值。array = array + 1是重新赋值操作:array + 1会生成一个新的NumPy数组并占据新的内存地址,随后array变量指向这个新地址。此时原内存块(与Tensor共享的部分)未被修改,Tensor的值自然保持不变;后续对新array的原地修改,也只会作用于新内存,和Tensor无关。
内容的提问来源于stack exchange,提问作者Tavakoli
相关产品推荐
相关产品推荐

