torch.tensor、numpy.array、list三者之间互相转换
torch.tensor、numpy.array、list三者之间互相转换
1.1 list 转 numpy
ndarray = np.array(list)
1.2 numpy 转 list
list = ndarray.tolist()
2.1 list 转 torch.Tensor
tensor=torch.Tensor(list)
2.2 torch.Tensor 转 list
先转numpy,后转list
list = tensor.numpy().tolist()
3.1 torch.Tensor 转 numpy
转换后共享内存
注意,转换后的 pytorch tensor 与 numpy array 指向同一地址,所以,对一方的值改变另一方也随之改变
最完全最常用的将 Tensor 转成 numpy array 的方法如下:
x.detach().to('cpu').numpy()
在最简单的情况下,当你在 CPU 上有一个没有梯度的 PyTorch 张量时,你可以简单地调用 .numpy() 方法
ndarray = tensor.numpy()
*gpu上的tensor不能直接转为numpy
如果 Tensor 位于 “cpu” 以外的设备上,则需要先将其带回 CPU,然后才能调用 .numpy() 方法。
ndarray = tensor.cpu().numpy()
如果张量是需要梯度的计算图的一部分(也就是说,如果 x.requires_grad=True),则需要调用 .detach() 方法:
x = torch.eye(3, requires_grad=True)
x.detach().numpy()
3.2 numpy 转 torch.Tensor
tensor = torch.from_numpy(ndarray)
转换时改变数据类型
tensor = torch.from_numpy(x).type(torch.float32)
转换时发送到不同的设备上,如 GPU
if torch.cuda.is_available():
y = torch.from_numpy(x).to("cuda")
注意,当使用锁页内存(pytorch 中数据加载器的锁页内存 pinned memory)的方式加载数据时,数据放入 GPU 的时候,应该把 non_blocking=True,这样能够缩减访问时间,加快训练。
if torch.cuda.is_available():
y = torch.from_numpy(x).to("cuda", non_blocking=True)