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

为何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:26