首页 / PyTorch 入门教程 / 张量基础:创建、属性与数据类型

PyTorch 入门教程

张量基础:创建、属性与数据类型

本教程共 60 篇 · 第 4 篇 · 更新于 2026-08-17 · 约 2 分钟阅读

PyTorch张量TensordtypeshapeNumPy数据类型创建张量

本节目标:把张量(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 不初始化内存,里面是残留的垃圾值。新手看到奇怪数字别慌,这是正常的。需要确定内容就用 zerosones

三个核心属性

每个张量都有 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.float3232 位浮点,默认
torch.float6464 位浮点,即 double
torch.int6464 位整数,也叫 long
torch.bool布尔型

两个默认值最容易踩坑:

  1. 浮点张量默认是 float32,不是 float64。NumPy 默认是 float64,习惯 NumPy 的人常在这翻车。
  2. 整数张量默认是 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_numpynumpy() 是共享内存的。改一边,另一边跟着变:

arr[0] = 100
print(t)  # tensor([100, 2, 3]),同步变了!

想切断联系,用 clone() 复制一份:

t2 = torch.from_numpy(arr).clone()
Warning

共享内存不是 bug,是设计,为了省一次复制。但新手常在不知情时被改数据。记住:不想共享,就 clone()

小练习

动手验证一下这章的内容:

  1. torch.ones 创建 3 行 4 列的张量,打印 shape 和 numel。
  2. torch.arange(0, 20, 5) 转成 float32,观察 dtype 变化。
  3. 创建 NumPy 数组并转成张量,修改原数组,确认张量同步变化。

每题十秒就能跑完。卡住了就回看上面的代码,答案都在里面。

下章预告

张量怎么创建、什么属性、什么类型,到这里齐了。下一章我们玩转张量操作:索引切片、变形、拼接和广播。