在CPU上,torch.as_tensor(a)
与numpy数组的torch.from_numpy(a)
相同吗,a
? 如果没有,那为什么不呢?
来自torch.as_tensor
的文档
如果数据是相应
dtype
的ndarray
,并且device
是 CPU,不会执行任何复制。
来自torch.from_numpy
的文档:
返回的张量和
ndarray
共享相同的内存。修改 张量将反映在ndarray
中,反之亦然。
在这两种情况下,生成的张量的任何更改都会更改原始 numpy 数组。
a = np.array([[1., 2], [3, 4]])
t1 = torch.as_tensor(a)
t2 = torch.from_numpy(a)
t1[0, 0] = 42.
print(a)
# prints [[42., 2.], [3., 4.]]
t2[1, 1] = 55.
print(a)
# prints [[42., 2.], [3., 55.]]
此外,在这两种情况下,尝试resize_张量都会导致错误。
它们基本相同,除了as_tensor
更通用:
- 与
from_numpy
相反,它支持广泛的数据类型,包括列表,元组和本机Python标量。 as_tensor
支持直接更改 dtype 和设备,这在实践中非常方便,因为 Torch 张量的默认 dtype 是 float32,而对于 Numpy 数组,它是 float64。
当且仅当原始对象是 Numpy 数组并且请求的 dtype(如果有(与原始数据相同时,as_tensor
与原始数据共享内存。这些条件与from_numpy
相同,但设计后总是满足的。
是的,as_tensor
和from_numpy
是严格等价的。从文档中:
如果数据是具有相同 dtype 和设备的 NumPy 数组(ndarray(,则使用 torch.from_numpy(( 构造张量。