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
也是具有 autograd 历史记录的张量,则返回的张量将具有相同的历史记录。当
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 胶囊共享内存的张量。- 参数
obj (对象) – 张量、NumPy 数组、DLPack 胶囊、实现 Python 缓冲协议的对象、标量或标量序列。
- 关键字参数
dtype (
torch.dtype
, 可选) – 返回张量的 datatype。默认值:None
,这会导致返回张量的 datatype 从obj
推断得出。copy (布尔值, 可选) – 控制返回的张量是否与
obj
共享内存。默认值:None
,这会导致返回的张量尽可能与obj
共享内存。如果为True
,则返回的张量不会共享其内存。如果为False
,则返回的张量会与其共享其内存obj
并且如果无法共享,则会抛出错误。device (
torch.device
, 可选) – 返回张量的设备。默认值:None
,这会导致使用obj
的设备。或者,如果obj
是 Python 序列,则将使用当前默认设备。requires_grad (布尔值, 可选) – 返回的张量是否需要梯度。默认值:
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)