2025年10月21日

2.1.数据操作

2.1.1.入门

tensor 是一个张量,它表示一个多维的矩阵或数组。

# 创建一个张量
# 使用 arange 创建一个行向量 x ,这个行向量包含以0开始的前12个整数,它们默认创建为整数
x = torch.arange(12)
# 上式结果 tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
y = torch.tensor([1.0, 2.0, 3.0])

目标形状是(高度,宽度),那么在知道宽度后,高度会被自动计算得出

要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数,reshape(行,列)

例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵

2.1.2.运算符

torch.exp(x) 会对张量 x 中的每个元素计算 e 的 x 次方,即:exp(x)=e的x幂

张量连结,参数 dim 控制了拼接的方向

torch.cat((x, y), dim=0)
# dim=0 表示沿着第一个维度(通常是 行)进行拼接,列数 保持不变
# dim=1 表示沿着第二个维度(通常是 列)进行拼接,行数 保持不变

求和,对张量中的所有元素进行求和,会产生一个单元素张量

x.sum()
# 结果是 tensor(66.)
2.1.4.索引和切片

第一个元素的索引是0,最后一个元素索引是-1

X[-1], X[1:3]
# [-1]选择最后一个元素
# [1:3]选择第二个和第四个元素

Python 的切片操作是左闭右开区间

X[0:2, :] 表示:行部分 0:2,选择 第 0 行和第 1 行;列部分 :,选择 所有列

2.1.5.节省内存

id()函数:内存中引用对象的确切地址

before = id(Y)
Y = Y + X
id(Y) == before
# 结果为 False
# 首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置

但是,我们希望原地执行这些更新

使用切片表示法将操作的结果分配给先前分配的数组

Z[:] = X + Y

使用 X[:] = X + Y 或 X += Y 来减少内存开销

2.1.6.转换为其他Python对象
  • 深度学习框架中的张量 特别之处:

    • 自动求导(Autograd)支持

    • GPU 加速支持。可以使用 .to(device) 或 .cuda() 方法将张量移动到 GPU 上

    • 内存优化和惰性计算

    • 稀疏张量类型,允许以更高效的方式存储和操作这些数据,避免不必要的零值存储

将深度学习框架定义的张量转换为NumPy张量,torch张量和numpy数组将共享它们的底层内存

A = X.numpy()  # 将 PyTorch 的 Tensor 转换为 NumPy 数组

调用item()函数或Python的内置函数,将大小为1的张量转换为Python标量

a = torch.tensor([3.5])
a.item()
# 结果是3.5

更多推荐