对于 CPU 上的 numpy 数组,torch.as_tensor() 与 torch.from_numpy() 相同



在CPU上,torch.as_tensor(a)与numpy数组的torch.from_numpy(a)相同吗,a? 如果没有,那为什么不呢?

来自torch.as_tensor的文档

如果数据是相应dtypendarray,并且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_tensorfrom_numpy严格等价的。从文档中:

如果数据是具有相同 dtype 和设备的 NumPy 数组(ndarray(,则使用 torch.from_numpy(( 构造张量。

最新更新