1. NumPy 和 PyTorch Tensor 的格式对比
NumPy 使用的是 numpy.ndarray,而 PyTorch 使用的是 torch.Tensor,两者的格式在数据存储和计算方式上有所不同。
NumPy (numpy.ndarray)
import numpy as np
array = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(array.shape) # 输出: (2, 3)
print(type(array)) # <class 'numpy.ndarray'>
- 存储格式:数据存储在 CPU 内存中,默认是
float64。 - 索引方式:与 Python
list类似,可以用array[i, j]访问元素。 - 操作方式:可以用
np.min(array, axis=0)计算最小值,支持广播计算。
PyTorch (torch.Tensor)
import torch
tensor = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(tensor.shape) # 输出: torch.Size([2, 3])
print(type(tensor)) # <class 'torch.Tensor'>
- 存储格式:可以在 CPU 或 GPU(通过
.cuda())上存储,默认是float32。 - 索引方式:与 NumPy 相同,例如
tensor[i, j]访问元素。 - 操作方式:支持
torch.min(tensor, dim=0),但也支持梯度计算。
2. NumPy 和 Tensor 主要区别
| 特性 | NumPy (numpy.ndarray) | PyTorch (torch.Tensor) |
|---|---|---|
| 存储位置 | 仅支持 CPU | 支持 CPU 和 GPU(tensor.cuda()) |
| 数据类型 | 默认 float64 | 默认 float32(更快) |
| 自动求导 | 不支持 | 支持(requires_grad=True) |
| 计算库 | 只依赖 NumPy | 可用 GPU 加速(CUDA) |
| 转换方式 | .astype(np.float32) | .to(torch.float32) |
3. NumPy 和 Tensor 互相转换
Tensor 转 NumPy
tensor = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
array = tensor.numpy() # 转换为 NumPy
print(type(array)) # <class 'numpy.ndarray'>
⚠ 注意:转换后的 NumPy 数组和原始 Tensor 共享内存,修改其中一个会影响另一个。
NumPy 转 Tensor
array = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
tensor = torch.from_numpy(array) # 转换为 Tensor
print(type(tensor)) # <class 'torch.Tensor'>
⚠ 注意:转换后的 Tensor 仍然在 CPU,如果要在 GPU 计算,需要
.to(device)。
如果 NumPy 数组在 GPU 上使用:
tensor = torch.from_numpy(array).to('cuda')
总结
- NumPy (
numpy.ndarray) 只在 CPU 上计算,数据格式是float64,不支持自动求导。 - PyTorch Tensor (
torch.Tensor) 支持 GPU 加速,默认float32,可以自动求导。 - 互相转换:
tensor.numpy()转 NumPy(共享内存)。torch.from_numpy(array)转 Tensor(仍然在 CPU)。tensor.to('cuda')让 Tensor 运行在 GPU 上。