tensor转numpy,numpy转tensor
在PyTorch中,Tensor与NumPy数组的相互转换是常用操作,以下是具体方法和注意事项:
1. Tensor 转 NumPy 数组
使用 Tensor 的 .numpy()
方法,适用于 CPU 上的 Tensor。
示例:
import torch
import numpy as np# 创建CPU上的Tensor
cpu_tensor = torch.tensor([1, 2, 3, 4])
# 转换为NumPy数组
numpy_array = cpu_tensor.numpy()print(type(numpy_array)) # <class 'numpy.ndarray'>
print(numpy_array) # [1 2 3 4]
注意事项:
- 共享内存:CPU Tensor 与转换后的 NumPy 数组共享内存,修改其中一个会影响另一个:
cpu_tensor[0] = 100 print(numpy_array) # [100 2 3 4](被同步修改)
- GPU Tensor 需先移至 CPU:若 Tensor 在 GPU 上,需先用
.cpu()
转移到 CPU 再转换:gpu_tensor = torch.tensor([1, 2, 3]).cuda() # GPU上的Tensor numpy_array = gpu_tensor.cpu().numpy() # 先转CPU再转NumPy
- 带梯度的 Tensor:若 Tensor 开启了梯度跟踪(
requires_grad=True
),需先用.detach()
剥离梯度:grad_tensor = torch.tensor([1, 2, 3], requires_grad=True) numpy_array = grad_tensor.detach().numpy() # 剥离梯度后转换
2. NumPy 数组 转 Tensor
使用 torch.from_numpy()
方法,转换后的数据默认在 CPU 上。
示例:
import numpy as np
import torch# 创建NumPy数组
numpy_array = np.array([1, 2, 3, 4])
# 转换为Tensor
tensor = torch.from_numpy(numpy_array)print(type(tensor)) # <class 'torch.Tensor'>
print(tensor) # tensor([1, 2, 3, 4], dtype=torch.int64)
注意事项:
- 共享内存:与 Tensor 转 NumPy 类似,CPU 上的 Tensor 与原 NumPy 数组共享内存:
numpy_array[0] = 100 print(tensor) # tensor([100, 2, 3, 4], dtype=torch.int64)(被同步修改)
- 强制复制(不共享内存):若不想共享内存,可使用
torch.tensor()
重新创建(会复制数据):tensor = torch.tensor(numpy_array) # 复制数据,不共享内存
- 转移到 GPU:转换后若需在 GPU 上运行,可加
.cuda()
:gpu_tensor = torch.from_numpy(numpy_array).cuda()
总结
转换方向 | 方法 | 关键注意点 |
---|---|---|
Tensor → NumPy | tensor.numpy() | 需在 CPU 上,共享内存;GPU 需先 .cpu() |
NumPy → Tensor | torch.from_numpy(numpy_array) | 默认在 CPU,共享内存;可加 .cuda() 移至 GPU |
根据是否需要共享内存、是否在 GPU 上,选择合适的转换方式即可。