张量基础:创建、属性与数据类型
本教程共 60 篇 · 第 4 篇 · 更新于 2026-08-17 · 约 2 分钟阅读
本节目标:把张量(Tensor)研究透——它有多少种创建方式,自带哪些属性,数据类型怎么选,以及和 NumPy 怎么互相转换。
张量是什么
上一章我们把张量比作「带维度的表格」。现在说得准确点:张量是多维数组,是 PyTorch 里所有数据的载体。
按维度分:
- 0 维:标量,就一个数。
- 1 维:向量,一串数,像 Python 列表。
- 2 维:矩阵,一张表格。
- 3 维及以上:多个表格堆叠,深度学习里很常见。
拿 Excel 打比方:一个单元格是标量,一行是向量,整张表是矩阵。多个工作表叠在一起,就是三维张量。一张彩色图片是 3 维张量:高 × 宽 × 颜色通道。一批图片就是 4 维。概念不复杂,就是一层层套。
创建张量的常用方法
PyTorch 给了一整套创建函数,记住最常用的几个就行:
import torch
torch.tensor([1, 2, 3]) # 从数据直接创建
torch.zeros(2, 3) # 全 0
torch.ones(2, 3) # 全 1
torch.empty(2, 3) # 不初始化,内容是垃圾值
torch.rand(2, 3) # 0~1 均匀随机
torch.randn(2, 3) # 标准正态随机,均值 0 方差 1
torch.arange(0, 10, 2) # 等差数列,类似 range
torch.linspace(0, 1, 5) # 0 到 1 均匀取 5 个点
torch.eye(3) # 单位矩阵,对角线为 1
torch.full((2, 3), 7) # 全部填 7
每个函数后面接的形状参数,就是你要的维度。这些函数各有用途:zeros 初始化偏置,randn 生成随机权重,arange 造序列,后面章节都会见到。
Warning
torch.empty不初始化内存,里面是残留的垃圾值。新手看到奇怪数字别慌,这是正常的。需要确定内容就用zeros或ones。
三个核心属性
每个张量都有 shape、dtype、device 三个属性,它们决定了张量的一切行为:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
print(x.shape) # torch.Size([2, 3])
print(x.size()) # 同上,另一种写法
print(x.dtype) # torch.float32
print(x.device) # cpu
print(x.dim()) # 2,维度数
print(x.numel()) # 6,元素总数
shape 是形状,一个元组,从外到内数每个维度的大小。x.size() 和 x.shape 等价,见哪个用哪个。dim() 告诉你几维,numel() 告诉你总共多少个元素,调试时查形状异常最常用。
数据类型:最容易踩的坑
PyTorch 的数据类型(dtype)比 Python 内置类型丰富,常用的有:
| dtype | 说明 |
|---|---|
torch.float32 | 32 位浮点,默认 |
torch.float64 | 64 位浮点,即 double |
torch.int64 | 64 位整数,也叫 long |
torch.bool | 布尔型 |
两个默认值最容易踩坑:
- 浮点张量默认是 float32,不是 float64。NumPy 默认是 float64,习惯 NumPy 的人常在这翻车。
- 整数张量默认是 int64(long)。
创建时用 dtype 参数指定,也可以随时转换:
import torch
x = torch.tensor([1, 2, 3], dtype=torch.float32)
y = x.to(torch.float64) # 转换类型
print(x.dtype, y.dtype)
输出:
torch.float32 torch.float64
深度学习里几乎都用 float32。原因很实在:显存有限,float64 占的空间是 float32 的两倍,速度还更慢。除非特殊精度需求,别乱动它。
Tip
.to()是 PyTorch 的万能转换方法,既能换 dtype 也能换设备。后面把张量搬到 GPU,用的也是它。
设备和搬移
张量默认创建在 CPU 上。有 GPU 时,可以把它搬过去加速计算:
import torch
x = torch.rand(2, 3)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = x.to(device)
print(x.device)
没 GPU 时 device 是 cpu,代码照跑不误。这一行判断是新手抄作业的常见样板,先记住写法,设备管理后面有专门一章。
Note新版 PyTorch 推荐设备无关写法:
torch.accelerator.current_accelerator()这类接口(2.12+)。同一份代码在 CUDA、MPS、XPU 上都能跑。torch.cuda.*老接口仍可用,但新项目建议逐步迁移。
和 NumPy 互转
PyTorch 和 NumPy 可以互相转换:
import numpy as np
import torch
# NumPy 数组 -> 张量
arr = np.array([1, 2, 3])
t = torch.from_numpy(arr)
# 张量 -> NumPy 数组
arr2 = t.numpy()
这里有个大坑:from_numpy 和 numpy() 是共享内存的。改一边,另一边跟着变:
arr[0] = 100
print(t) # tensor([100, 2, 3]),同步变了!
想切断联系,用 clone() 复制一份:
t2 = torch.from_numpy(arr).clone()
Warning共享内存不是 bug,是设计,为了省一次复制。但新手常在不知情时被改数据。记住:不想共享,就
clone()。
小练习
动手验证一下这章的内容:
- 用
torch.ones创建 3 行 4 列的张量,打印 shape 和 numel。 - 把
torch.arange(0, 20, 5)转成 float32,观察 dtype 变化。 - 创建 NumPy 数组并转成张量,修改原数组,确认张量同步变化。
每题十秒就能跑完。卡住了就回看上面的代码,答案都在里面。
下章预告
张量怎么创建、什么属性、什么类型,到这里齐了。下一章我们玩转张量操作:索引切片、变形、拼接和广播。