介绍
PyTorch 中的 torch.linspace() 函数,这是生成 均匀分布张量 的核心工具,常用来创建 测试数据、坐标网格等。
作用
在指定的起始值和结束值之间,生成固定数量的、等间距的数值(线性间距),返回一个 1 维张量。
特点
不管起始/结束值是多少,生成的数值数量是固定的,且相邻数值的间隔相等;
应用场景
- 绘制函数曲线:生成x轴的均匀采样点,计算y值后绘图(如正弦/余弦曲线);
- 创建坐标网格:结合
torch.meshgrid()生成二维坐标(如图像处理中的像素坐标); - 测试模型输入:生成固定范围的测试数据,验证模型输出的单调性/连续性;
- 神经网络初始化:生成均匀分布的初始参数(虽不常用,但可作为基础工具)。
与 torch.arange() 区别
torch.arange():arange 按“步长”生成,数量不固定;linspace 按“数量”生成,步长不固定。
语法
torch.linspace(start, end, steps=100, dtype=None, device=None, requires_grad=False)
参数
start:序列的起始值(必传);end:序列的结束值(必传,包含该值);steps:生成的数值数量,默认 100;dtype:输出张量的数据类型(如torch.float32),默认继承start/end的类型;device:张量所在设备(如cuda:0);requires_grad:是否需要梯度,默认 False。
返回值
返回一维向量,有100个元素
例子
import torch
# ========== 示例1:基础用法(默认steps=100) ==========
# 生成0到1之间的100个等间距数值(包含0和1)
x1 = torch.linspace(0, 1)
print("默认steps的张量形状:", x1.shape) # torch.Size([100])
print("第一个值:", x1[0], "最后一个值:", x1[-1]) # tensor(0.) tensor(1.)
print("步长:", x1[1] - x1[0]) # tensor(0.0101)(1/99≈0.0101)
# ========== 示例2:指定steps数量 ==========
# 生成0到10之间的5个等间距数值(包含0和10)
x2 = torch.linspace(0, 10, steps=5)
print("\nsteps=5的张量:", x2)
# 输出: tensor([ 0.0000, 2.5000, 5.0000, 7.5000, 10.0000])
print("步长:", x2[1] - x2[0]) # tensor(2.5)(10/4=2.5)
# ========== 示例3:起始值 > 结束值(反向生成) ==========
# 生成10到0之间的3个等间距数值
x3 = torch.linspace(10, 0, steps=3)
print("\n反向生成的张量:", x3) # tensor([10., 5., 0.])
# ========== 示例4:指定数据类型和设备 ==========
# 生成float64类型、cuda设备的张量(需有GPU)
x4 = torch.linspace(-5, 5, steps=4, dtype=torch.float64, device="cpu") # 替换为cuda:0可测试GPU
print("\n指定dtype的张量:", x4)
# 输出: tensor([-5.0000, -1.6667, 1.6667, 5.0000], dtype=torch.float64)
# ========== 示例5:生成二维张量(结合unsqueeze) ==========
# 先生成1维张量,再扩展维度(常用在绘图/网络输入)
x5 = torch.linspace(0, 2*torch.pi, steps=100).unsqueeze(1) # 形状变为 [100, 1]
y5 = torch.sin(x5) # 计算正弦值,适配二维形状
print("\n二维张量形状:", x5.shape) # torch.Size([100, 1])
进阶示例:生成二维坐标网格
# 生成x轴(-2到2,20个点)和y轴(-2到2,20个点)
x = torch.linspace(-2, 2, steps=20)
y = torch.linspace(-2, 2, steps=20)
# 生成网格坐标
xx, yy = torch.meshgrid(x, y, indexing="xy")
print("网格xx形状:", xx.shape) # torch.Size([20, 20])
print("网格yy形状:", yy.shape) # torch.Size([20, 20])
# xx[i][j] = x[j], yy[i][j] = y[i],构成二维平面的坐标点
总结
torch.linspace(start, end, steps)生成start到end之间的steps个等间距数值,包含end值;- 核心区别于
torch.arange():linspace定数量、步长自适应;arange定步长、数量自适应; - 常用场景:绘制函数曲线、生成坐标网格、创建测试数据,可通过
unsqueeze扩展维度适配多维计算。