1. numpy转tensor
1.1 torch.from_numpy()
如果你有一个 NumPy 数组,你可以直接使用 torch.from_numpy
方法将其转换为 PyTorch 张量
这个方法会创建一个新的张量,该张量与原始的NumPy数组共享内存空间
。这意味着,如果你修改了其中一个,另一个也会相应地改变。
import numpy as np
import torch
np_array = np.array([1, 2, 3])
tensor = torch.from_numpy(np_array)
print(tensor)
如果你想在 GPU 上创建张量,可以先将 NumPy 数组转换为张量,然后使用.to
方法将其移动到 GPU。
tensor = torch.from_numpy(np_array).to('cuda')
1.2 torch.tensor()
torch.tensor() 是 PyTorch 中用于创建新张量(tensor)的函数。这个函数非常灵活
,可以接受多种类型的输入,包括列表、元组、NumPy 数组、标量值,甚至是另一个张量。它将这些输入转换为 PyTorch 张量,并默认复制数据,这意味着原始数据和新创建的张量在内存中是独立的
。
# 指定数据类型为float
tensor_with_dtype = torch.tensor([1, 2, 3], dtype=torch.float)
print(tensor_with_dtype)
# 指定数据类型为long
tensor_with_dtype_long = torch.tensor([1, 2, 3], dtype=torch.long)
print(tensor_with_dtype_long)
指定device
if torch.cuda.is_available():
tensor_on_gpu = torch.tensor([1, 2, 3], device='cuda')
print(tensor_on_gpu)
注意事项
- torch.tensor() 默认会复制输入数据,
创建一个新的张量副本
。这意味着对新张量的修改不会影响到原始数据。 - 你可以指定数据类型(dtype),如果不指定,PyTorch 会尝试推断数据类型或使用默认类型(通常是 torch.float32)。
- 你可以指定设备(device),将张量创建在 CPU 或 GPU 上。
1.3 torch.as_tensor()
在PyTorch中,torch.as_tensor函数用于将数据转换为一个新的torch.Tensor对象。这个函数对于将不同类型的数据(如列表、元组、NumPy数组等)转换为PyTorch张量非常有用。它通常用于数据预处理阶段,将数据转换为模型可以接受的格式
。
- 从列表创建张量
import torch
list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data)
print(tensor) # 输出: tensor([1, 2, 3])
- 从NumPy数组创建张量
import numpy as np
import torch
np_array = np.array([1, 2, 3])
tensor = torch.as_tensor(np_array)
print(tensor) # 输出: tensor([1, 2, 3])
- 从元组创建张量:
import torch
tuple_data = (1, 2, 3)
tensor = torch.as_tensor(tuple_data)
print(tensor) # 输出: tensor([1, 2, 3])
- 指定数据类型
import torch
list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data, dtype=torch.float32)
print(tensor) # 输出: tensor([1., 2., 3.], dtype=torch.float32)
- 设备指定
import torch
list_data = [1, 2, 3]
tensor = torch.as_tensor(list_data, device='cuda:0') # 假设有一个可用的CUDA设备
print(tensor) # 输出: tensor([1., 2., 3.], device='cuda:0')
torch.as_tensor函数提供了一个灵活的方式来创建张量,并且可以指定数据类型和设备,这对于深度学习模型的输入数据准备非常有用。
1.4 对比
torch.from_numpy()、torch.tensor()和torch.as_tensor()这三种方法都可以用来将NumPy数组转换为PyTorch张量,但它们之间有一些差异:
(1). torch.from_numpy(numpy_array)
- 这个方法会创建一个新的张量,该张量与原始的NumPy数组共享内存空间。这意味着,如果你修改了其中一个,另一个也会相应地改变。
- 它只接受NumPy数组作为输入,并且要求NumPy数组的数据类型是PyTorch支持的类型。
它不会对数据进行复制,因此转换非常高效。
(2)torch.tensor(numpy_array)
-
这个方法会创建一个新的张量,并且复制NumPy数组中的数据。这意味着,原始的NumPy数组和新创建的张量是完全独立的,修改其中一个不会影响另一个。
-
因为它会复制数据,所以
相比于torch.from_numpy()
,它的效率会稍低。
(3) torch.as_tensor(numpy_array)
- 这个方法会尝试避免复制数据,如果可能的话,它将与torch.from_numpy()一样共享内存。但是,如果NumPy数组的数据类型不是PyTorch支持的类型,它会复制数据并转换数据类型。
- 它比torch.from_numpy更灵活,因为它可以接受更多的输入类型,包括标量、列表、元组等,并且会尝试将它们转换为张量。
- 如果输入是标量或Python原生类型,它会创建一个包含该值的零维张量
总结来说,如果你不需要复制数据,并且你的NumPy数组已经是PyTorch支持的数据类型,那么torch.from_numpy()是最快的选择
。如果你需要一个独立的副本,那么torch.tensor()是合适的。而torch.as_tensor()则是一个折中的选择,它在可能的情况下避免复制,但在必要时会复制并转换数据类型。
2. tensor 转numpy
tensor 转numpy 就比较简单了,可以使用下面的函数直接转,
def to_numpy(tensor_data):
return tensor_data.detach().cpu().numpy() if tensor_data.requires_grad else tensor_data.cpu().numpy()