系列导读:本系列共 6 篇,从 PyTorch 框架入门到实战案例,带你系统掌握深度学习开发。上一篇:PyTorch 优势全解析——为什么科研和工业都爱它
一、什么是张量(Tensor)
1.1 张量是 PyTorch 的核心
张量是 PyTorch 中最核心的数据抽象,可以理解为:
- 元素为同一种数据类型的多维矩阵
- 与 NumPy 数组类似,但支持 GPU 加速和自动微分
- 以"类"的形式封装,内置丰富的运算和方法
1.2 张量的维度(阶)

张量的维度数量称为阶(Rank)或维数,通过 ndim 属性查看:
| 0 | 标量(Scalar) | torch.tensor(5) | [] |
| 1 | 向量(Vector) | torch.tensor([1, 2, 3]) | [3] |
| 2 | 矩阵(Matrix) | torch.tensor([[1,2],[3,4]]) | [2, 2] |
| 3 | 三维张量 | 一张彩色图片 [C, H, W] | [3, 224, 224] |
| 4 | 四维张量 | 一个批次图片 [B, C, H, W] | [64, 3, 224, 224] |
import torch
# 0 阶张量(标量)
x0 = torch.tensor(2)
print(f"x0: {x0}, 阶数: {x0.ndim}, 形状: {x0.size()}")
# 输出:x0: 2, 阶数: 0, 形状: torch.Size([])
# 1 阶张量(向量)
x1 = torch.tensor([1, 2, 3])
print(f"阶数: {x1.ndim}, 形状: {x1.shape}")
# 输出:阶数: 1, 形状: torch.Size([3])
# 2 阶张量(矩阵)
x2 = torch.tensor([[2, 3, 4], [5, 6, 7]])
print(f"阶数: {x2.ndim}, 形状: {x2.size()}")
# 输出:阶数: 2, 形状: torch.Size([2, 3])
1.3 张量的关键属性
| shape / size() | 张量形状 | torch.Size([2, 3]) |
| ndim / dim() | 维度数量 | 2 |
| dtype | 数据类型 | torch.float32 |
| numel() | 元素总数 | 6 |
| device | 存储设备 | cpu / cuda:0 |
二、张量的创建方式
2.1 从数据创建
# 根据指定数据创建张量
data = torch.tensor([1, 2, 3])
print(data)
# 指定数据类型
data = torch.tensor([1, 2, 3], dtype=torch.float32)
print(data.dtype) # torch.float32
2.2 根据形状创建(随机初始化)
# 创建 2 行 3 列的浮点张量,默认 float32
data = torch.Tensor(2, 3)
print(data)
# 注意:Tensor 大写用于创建空张量
# tensor 小写用于从数据创建
2.3 创建指定类型的张量
# 各类张量创建方式
data = torch.IntTensor([2, 3]) # int32
data = torch.LongTensor([2, 3]) # int64
data = torch.FloatTensor([2.5, 3]) # float32(默认)
data = torch.DoubleTensor([2, 3]) # float64
# 不显示的类型:FloatTensor→float32,LongTensor→int64
2.4 线性张量
# 固定步长生成 [start, end, step),左闭右开
data = torch.arange(0, 10, 2)
print(data) # tensor([0, 2, 4, 6, 8])
# 固定元素数生成 [start, end],左闭右闭的等差数列
data = torch.linspace(0, 9, 10)
print(data) # tensor([0., 1., 2., …, 9.])
2.5 随机张量 ⭐⭐⭐
# 标准正态分布随机数
data = torch.randn(2, 3)
print(data)
# 随机整数 [low, high),左闭右开
data = torch.randint(low=0, high=10, size=(4, 6))
print(data)
# 设置随机种子,保证可复现
torch.manual_seed(100)
data = torch.randn(2, 3)
print('随机数种子:', torch.initial_seed())
2.6 创建全 0 / 全 1 / 全指定值张量
# 全 0 张量
data = torch.zeros(3, 2)
# 根据形状创建全 0(复制输入张量的形状)
base = torch.tensor([3, 2])
data = torch.zeros_like(base)
# 全 1 张量
data = torch.ones(3, 2)
data = torch.ones_like(base)
# 全指定值
data = torch.full((2, 2), 10) # 全 10
data = torch.full_like(base, 20) # 根据 base 的形状,全 20
易错点:
- torch.zeros(3) → 默认 float32
- torch.zeros_like(数据) → 类型跟着输入走
三、张量数据类型转换
3.1 张量与 NumPy 互转
import numpy as np
import torch
# === 张量 → NumPy(共享内存!)===
data_tensor = torch.tensor([1, 3, 4])
data_numpy = data_tensor.numpy()
# ⚠️ 共享内存:修改一个,另一个也变
data_numpy[0] = 100
print(data_tensor) # tensor([100, 3, 4])
# 使用 copy 避免共享
data_numpy = data_tensor.numpy().copy()
# === NumPy → 张量 ===
data_numpy = np.array([1, 3, 4])
# 方式 1:共享内存
data_tensor = torch.from_numpy(data_numpy)
# 方式 2:不共享内存(推荐)
data_tensor = torch.tensor(data_numpy)
# 或
data_tensor = torch.from_numpy(data_numpy).clone()
3.2 提取标量值
# 只有单元素张量才能用 item()
x = torch.tensor([2])
print(x.item()) # 2
x = torch.tensor(22)
print(x.item()) # 22
# 多元素张量不能用 item()
x = torch.randint(0, 4, (3, 2))
# print(x.item()) # ❌ 报错!
3.3 类型转换方法
data = torch.full((3, 2), 10)
print(data.dtype) # torch.int64
# 方式 1:type() 方法
data = data.type(torch.float64)
# 方式 2:简洁方法(推荐 ⭐⭐⭐)
data = data.double() # float64
data = data.float() # float32
data = data.int() # int32
data = data.long() # int64
data = data.short() # int16
四、张量基础总结
| 从数据创建 | torch.tensor(data) | 最常用 |
| 按形状创建 | torch.Tensor(m, n) | 随机初始化 |
| 指定类型创建 | torch.FloatTensor() 等 | 明确数据类型 |
| 线性序列 | torch.arange() / linspace() | 等差数列 |
| 随机张量 | torch.randn() / randint() | 正态/均匀分布 |
| 全值张量 | torch.zeros() / ones() / full() | 0/1/指定值 |
| 转 NumPy | .numpy() | 共享内存 |
| 从 NumPy 转 | torch.from_numpy() / torch.tensor() | 后者不共享 |
| 类型转换 | .float() / .double() / .int() | 简洁推荐 |
| 取标量值 | .item() | 仅单元素可用 |
五、下一篇预告
PyTorch 深度学习笔记(四):张量运算与变形——数值计算与索引进阶
将详细介绍张量的点乘、矩阵乘法、统计函数、索引操作(布尔索引、多维索引),以及 reshape、transpose、view 等形状变换操作。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注!你的支持是我持续创作的动力。
网硕互联帮助中心



评论前必须登录!
注册