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 上。