torch.asarray

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

obj 转换为张量。

obj 可以是以下项之一:

  1. 张量

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

  3. DLPack胶囊

  4. 符合Python缓冲协议的对象

  5. 标量

  6. 一串标量值

obj 是一个张量、NumPy 数组或 DLPack 胶囊时,返回的张量默认情况下不会需要梯度计算,并且与 obj 具有相同的数据类型和设备。同时,它们会共享内存。可以通过 dtypedevicecopyrequires_grad 关键字参数来控制这些属性。如果返回的张量具有不同的数据类型,位于不同的设备上,或者请求了副本,则它将不会与 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() 创建一个与实现 buffer 协议的对象共享内存的张量。torch.from_dlpack() 创建一个从 DLPack 封装体中共享内存的张量。

参数

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

关键字参数
  • dtype (torch.dtype, 可选) – 返回的张量的数据类型。默认值为 None,这意味着返回的张量的数据类型将从 obj 推断得出。

  • copy (bool, 可选) – 控制返回的张量是否与obj共享内存。默认值为None,这意味着在可能的情况下,默认会使得返回的张量与obj共享内存。如果设置为True,则返回的张量不会与其共享内存;若设置为False,则返回的张量将尝试与obj共享内存,并在无法实现时抛出错误。

  • device (torch.device, 可选) – 返回张量的设备。默认值为 None,表示使用 obj 的设备。如果 obj 是一个 Python 序列,则会使用当前默认设备。

  • requires_grad (bool, 可选) – 是否需要计算返回张量的梯度。默认值为False,表示不需要记录梯度信息。如果设置为True,则返回的张量将需要计算梯度,并且如果obj本身也是一个具有自动求导历史的张量,则返回的张量也将拥有相同的历史。

示例:

>>> a = torch.tensor([1, 2, 3])
>>> # Shares memory with tensor 'a'
>>> b = torch.asarray(a)
>>> a.data_ptr() == b.data_ptr()
True
>>> # Forces memory copy
>>> 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=<AddBackward0>)
>>> # Shares memory with tensor 'b', with no grad
>>> c = torch.asarray(b)
>>> c
tensor([3., 4., 5.])
>>> # Shares memory with tensor 'b', retaining autograd history
>>> d = torch.asarray(b, requires_grad=True)
>>> d
tensor([3., 4., 5.], grad_fn=<AddBackward0>)

>>> array = numpy.array([1, 2, 3])
>>> # Shares memory with array 'array'
>>> t1 = torch.asarray(array)
>>> array.__array_interface__['data'][0] == t1.data_ptr()
True
>>> # Copies memory due to dtype mismatch
>>> 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)
本页目录