Shortcuts

torch.asarray

torch.asarray(obj, *, dtype=None, device=None, copy=None, requires_grad=False) 张量

obj 转换为张量。

obj 可以是以下之一:

  1. 一个张量

  2. 一个 NumPy 数组或一个 NumPy 标量

  3. 一个DLPack胶囊

  4. 一个实现了Python缓冲协议的对象

  5. 一个标量

  6. 一系列标量

obj 是张量、NumPy 数组或 DLPack 胶囊时,返回的张量将默认不需要梯度,具有与 obj 相同的 dtype,位于同一设备上,并与它共享内存。这些属性可以通过 dtypedevicecopyrequires_grad 关键字参数来控制。如果返回的张量具有不同的 dtype、位于不同的设备上,或者请求了副本,则它不会与 obj 共享内存。如果 requires_gradTrue,则返回的张量将需要梯度,并且如果 obj 也是一个具有自动求导历史的张量,则返回的张量将具有相同的历史。

obj 不是张量、NumPy 数组或 DLPack 胶囊,但实现了 Python 的缓冲区协议时,缓冲区将被解释为根据传递给 dtype 关键字参数的数据类型大小分组的字节数组。(如果没有传递数据类型,则使用默认的浮点数据类型。)返回的张量将具有指定的数据类型(或者如果没有指定,则使用默认的浮点数据类型),并且默认情况下,将在 CPU 设备上并与缓冲区共享内存。

obj 是 NumPy 标量时,返回的张量将是一个在 CPU 上的 0 维张量,并且不共享其内存(即 copy=True)。默认情况下,数据类型将是与 NumPy 标量的数据类型相对应的 PyTorch 数据类型。

obj 不是上述任何一种但为标量,或标量序列时,返回的张量将默认从标量值推断其数据类型,位于当前默认设备上,并且不共享其内存。

另请参阅

torch.tensor() 创建一个总是从输入对象复制数据的张量。 torch.from_numpy() 创建一个总是与NumPy数组共享内存的张量。 torch.frombuffer() 创建一个总是与实现缓冲协议的对象共享内存的张量。 torch.from_dlpack() 创建一个总是与DLPack胶囊共享内存的张量。

Parameters

obj (对象) – 一个张量、NumPy数组、DLPack胶囊、实现Python缓冲协议的对象、标量或标量的序列。

Keyword Arguments
  • dtype (torch.dtype, 可选) – 返回张量的数据类型。 默认值: None,这将导致返回张量的数据类型从obj推断。

  • copy (bool, 可选) – 控制返回的张量是否与 obj 共享内存。 默认值: None,这会导致返回的张量尽可能与 obj 共享内存。如果 True,则返回的张量不共享其内存。 如果 False,则返回的张量与 obj 共享其内存,并且在无法共享时抛出错误。

  • 设备 (torch.device, 可选) – 返回张量的设备。 默认值: None,这将导致使用 obj 的设备。或者,如果 obj 是一个 Python 序列,将使用当前默认设备。

  • requires_grad (bool, 可选) – 返回的张量是否需要梯度。 默认值:False,这会导致返回的张量不需要梯度。 如果 True,则返回的张量将需要梯度,并且如果 obj 也是一个具有自动求导历史的张量,则返回的张量将具有相同的求导历史。

示例:

>>> a = torch.tensor([1, 2, 3])
>>> # 与张量 'a' 共享内存
>>> b = torch.asarray(a)
>>> a.data_ptr() == b.data_ptr()
True
>>> # 强制内存复制
>>> c = torch.asarray(a, copy=True)
>>> a.data_ptr() == c.data_ptr()
False

>>> a = torch.tensor([1., 2., 3.], requires_grad=True)
>>> b = a + 2
>>> b
tensor([3., 4., 5.], grad_fn=)
>>> # 与张量 'b' 共享内存,没有梯度
>>> c = torch.asarray(b)
>>> c
tensor([3., 4., 5.])
>>> # 与张量 'b' 共享内存,保留自动梯度历史
>>> d = torch.asarray(b, requires_grad=True)
>>> d
tensor([3., 4., 5.], grad_fn=)

>>> array = numpy.array([1, 2, 3])
>>> # 与数组 'array' 共享内存
>>> t1 = torch.asarray(array)
>>> array.__array_interface__['data'][0] == t1.data_ptr()
True
>>> # 由于数据类型不匹配而复制内存
>>> t2 = torch.asarray(array, dtype=torch.float32)
>>> array.__array_interface__['data'][0] == t2.data_ptr()
False

>>> scalar = numpy.float64(0.5)
>>> torch.asarray(scalar)
tensor(0.5000, dtype=torch.float64)