torch.asarray¶
- torch.asarray(obj: Any, *, dtype: Optional[dtype], device: Optional[DeviceLikeType], copy: Optional[bool] = None, requires_grad: bool = False) Tensor¶
將
obj轉換為張量(tensor)。obj可以是以下型別之一:一個張量(tensor)
一個 NumPy 陣列或 NumPy 標量
一個 DLPack capsule
一個實現 Python buffer protocol(緩衝區協議)的物件
一個標量
一個標量序列
當
obj是張量、NumPy 陣列或 DLPack capsule 時,返回的張量預設不要求梯度、具有與obj相同的資料型別、位於同一裝置上並與其共享記憶體。這些屬性可以透過dtype、device、copy和requires_grad關鍵字引數控制。如果返回的張量資料型別不同、位於不同裝置上或請求了複製,則它將不與obj共享記憶體。如果requires_grad為True,則返回的張量將要求梯度,並且如果obj也是一個具有 autograd 歷史的張量,則返回的張量將具有相同的歷史。當
obj不是張量、NumPy 陣列或 DLPack capsule,但實現了 Python buffer protocol(緩衝區協議)時,緩衝區被解釋為一個位元組陣列,這些位元組根據傳遞給dtype關鍵字引數的資料型別大小進行分組。(如果沒有傳遞資料型別,則使用預設的浮點資料型別。)返回的張量將具有指定的資料型別(如果未指定則使用預設浮點資料型別),並且預設位於 CPU 裝置上並與緩衝區共享記憶體。當
obj是 NumPy 標量時,返回的張量將是 CPU 上的 0 維張量,且不共享記憶體(即copy=True)。預設情況下,資料型別將是與 NumPy 標量資料型別對應的 PyTorch 資料型別。當
obj既不是上述型別,而是一個標量或標量序列時,返回的張量將預設從標量值推斷其資料型別,位於當前預設裝置上,且不共享記憶體。另請參閱
torch.tensor()建立的張量總是從輸入物件複製資料。torch.from_numpy()建立的張量總是與 NumPy 陣列共享記憶體。torch.frombuffer()建立的張量總是與實現 buffer protocol(緩衝區協議)的物件共享記憶體。torch.from_dlpack()建立的張量總是與 DLPack capsules 共享記憶體。- 引數
obj (object) – 張量、NumPy 陣列、DLPack Capsule、實現 Python buffer protocol(緩衝區協議)的物件、標量或標量序列。
- 關鍵字引數
dtype (
torch.dtype, optional) – 返回張量的資料型別。預設值:None,此時返回張量的資料型別將從obj推斷。copy (bool, optional) – 控制返回的張量是否與
obj共享記憶體。預設值:None,此時返回的張量會盡可能與obj共享記憶體。如果為True,則返回的張量不共享記憶體。如果為False,則返回的張量與obj共享記憶體,如果無法共享則丟擲錯誤。device (
torch.device, optional) – 返回張量的裝置。預設值:None,此時將使用obj的裝置。或者,如果obj是 Python 序列,則將使用當前預設裝置。requires_grad (bool, optional) – 返回張量是否需要梯度。預設值:
False,此時返回的張量不需要梯度。如果為True,則返回的張量將需要梯度,並且如果obj也是一個具有 autograd 歷史的張量,則返回的張量將具有相同的歷史。
示例
>>> 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)