torch.asarray
- torch.asarray(obj, *, dtype=None, device=None, copy=None, requires_grad=False) → Tensor
-
将
obj
转换为张量。obj
可以是以下项之一:-
张量
-
一个 NumPy 数组或一个 NumPy 标量值
-
DLPack胶囊
-
符合Python缓冲协议的对象
-
标量
-
一串标量值
当
obj
是一个张量、NumPy 数组或 DLPack 胶囊时,返回的张量默认情况下不会需要梯度计算,并且与obj
具有相同的数据类型和设备。同时,它们会共享内存。可以通过dtype
、device
、copy
和requires_grad
关键字参数来控制这些属性。如果返回的张量具有不同的数据类型,位于不同的设备上,或者请求了副本,则它将不会与obj
共享内存。如果requires_grad
为True
,则返回的张量需要进行梯度计算,并且如果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)
-