我想深入了解torch.from_numpy()
的工作原理。
import numpy as np
import torch
arr = np.zeros((3, 3), dtype=np.float32)
t = torch.from_numpy(arr)
print("arr: {0}\nt: {1}\n".format(arr, t))
arr[0,0]=1
print("arr: {0}\nt: {1}\n".format(arr, t))
print("id(arr): {0}\nid(t): {1}".format(id(arr), id(t)))
输出看起来像这样:
arr: [[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
t: tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
arr: [[1. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
t: tensor([[1., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
id(arr): 2360964353040
id(t): 2360964352984
这是torch.from_numpy()
中文档的一部分:
from_numpy(ndarray)->张量
从:class:
Tensor
创建一个:class:numpy.ndarray
。返回的张量和:attr:
ndarray
共享相同的内存。修改张量将反映在:attr:ndarray
中,反之亦然。返回的张量不可调整大小。
这是来自id()
的文档:
返回对象的标识。
这在同时存在的对象中保证是唯一的。(CPython使用对象的内存地址。)
所以问题来了:由于ndarray arr
和张量t
共享相同的内存,为什么它们具有不同的内存地址?
有什么想法/建议吗?
是,t
和arr
是不同的Python对象,位于不同的内存区域(因此,不同的id
),但是都指向包含数据的同一内存地址(连续(通常为C)数组)。