提问人:Tavakoli 提问时间:11/12/2023 最后编辑:Tavakoli 更新时间:11/12/2023 访问量:43
为什么在numpy数组中更改从numpy转换而来的张量?
why Changing in numpy array change tensor that converted from numpy?
问:
当我将 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?
答:
1赞
OM222O
11/12/2023
#1
TL;博士:
+=
就地修改,但创建副本。x = x + 1
长版:
您可能想阅读有关固定内存的信息。我怀疑 PyTorch 正在使用它来减少数据传输开销以获得更好的性能。当您使用重新分配时,会创建一个副本(您可以尝试打印数组的地址,用于检查分配后地址是否更改,这意味着制作了副本)。当进行复制时,不再指向相同的内存地址,因此修改不再更新固定的内存。array = array + 1
id(array)
array
tensor
array
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 仍在使用旧数组,因此它仍保留在那里(不会释放内存),因此您仍然可以访问其旧内容(选中按引用传递与按值传递)。
评论
array = array + 1
array
array += 1