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

use*_*654 7 pytorch

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

从文档中torch.as_tensor

如果数据是ndarray对应的dtype并且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.]]
Run Code Online (Sandbox Code Playgroud)

此外,在这两种情况下,尝试调整张量的大小都会导致错误。

mil*_*bar 5

它们基本上是相同的,除了as_tensor更通用的:

  • 与 相反from_numpy,它支持多种数据类型,包括列表、元组和本机 Python 标量。
  • as_tensor支持直接更改数据类型和设备,这在实践中非常方便,因为 Torch 张量的默认数据类型是 float32,而 Numpy 数组的默认数据类型是 float64。

as_tensor当且仅当原始对象是 Numpy 数组,并且请求的 dtype(如果有)与原始数据相同时,才与原始数据共享内存。这些条件与 相同from_numpy,但后者的设计始终满足这些条件。