为什么在numpy数组中更改从numpy转换而来的张量?

why Changing in numpy array change tensor that converted from numpy?

提问人:Tavakoli 提问时间:11/12/2023 最后编辑:Tavakoli 更新时间:11/12/2023 访问量:43

问:

当我将 numpy 数组转换为张量并以不同的方式更改 numpy 时,有些会更改张量,有些则不会。

在此代码中:

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))

不,当我以这种方式将 1 添加到 numpy 数组时,它会更改张量值:

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))

但是当我以另一种方式更改numpy数组时,它不会更改张量:

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))

同样,此代码不会更改它:

array = np.arange(1., 8.)
tensor = torch.from_numpy(array)
array = array + 1
array += 1
array, tensor

当将 pytorch 的张量更改为 numpy 数组时,也会发生这种情况。

为什么这样工作numpy和torch?

python 数组 numpy pytorch 转换器

评论

0赞 Tim Roberts 11/12/2023
你在那里看到的东西也会发生在其他物体上。 必须创建一个全新的对象并将其存储在 中。这不会改变原始阵列,该阵列挂在火炬中。但是是一种特殊的方法,所以numpy知道它可以就地修改数组。array = array + 1arrayarray += 1

答:

1赞 OM222O 11/12/2023 #1

TL;博士:

+=就地修改,但创建副本。x = x + 1

长版:

您可能想阅读有关固定内存的信息。我怀疑 PyTorch 正在使用它来减少数据传输开销以获得更好的性能。当您使用重新分配时,会创建一个副本(您可以尝试打印数组的地址,用于检查分配后地址是否更改,这意味着制作了副本)。当进行复制时,不再指向相同的内存地址,因此修改不再更新固定的内存。array = array + 1id(array)arraytensorarray

import numpy as np
arr = np.arange(3)
print((arr, id(arr)))
arr+=1
print((arr, id(arr)))
arr = arr + 1
print((arr, id(arr)))

这(对我来说)导致:

(array([0, 1, 2]), 1951948494416)
(array([1, 2, 3]), 1951948494416)
(array([2, 3, 4]), 1952052860880)

创建副本时,GPU 仍在使用旧数组,因此它仍保留在那里(不会释放内存),因此您仍然可以访问其旧内容(选中按引用传递与按值传递)。