
本文将介绍PyTorch中张量的索引和切片操作。
本系列实验使用如下环境
conda create -n DL python==3.11conda activate DLconda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidiaTensor(张量)是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。
Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。在PyTorch中,可以使用size()方法获取张量的维度信息,使用dim()方法获取张量的轴数。

PyTorch中的张量可以具有不同的数据类型:
【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)
【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)
PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。
【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)
【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)
【深度学习】Pytorch 系列教程(五):PyTorch数据结构:2、张量的数学运算(3):向量范数(0、1、2、p、无穷)、矩阵范数(弗罗贝尼乌斯、列和、行和、谱范数、核范数)与谱半径详解
【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)
【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理
【深度学习】pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~ 四维张量;conv3d~五维张量)
【深度学习】Pytorch教程(九):PyTorch数据结构:3、张量的统计计算详解
【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量变形
在PyTorch中,可以使用索引和切片操作来访问和修改张量的特定元素或子集。
import torch
x = torch.tensor([1, 2, 3, 4, 5])
element = x[0] # 访问第一个元素
print(element)输出:
tensor(1)import torch
x = torch.tensor([1, 2, 3, 4, 5])
elements = x[[0, 2, 4]] # 访问第1、3、5个元素
print(elements)输出:
tensor([1, 3, 5])import torch
x = torch.tensor([1, 2, 3, 4, 5])
print(x[-1]) # 访问最后一个元素输出:
tensor(5)import torch
x = torch.tensor([1, 2, 3, 4, 5])
mask = x > 2 # 创建一个布尔掩码
elements = x[mask] # 访问大于2的元素
print(elements)输出:
tensor([3, 4, 5])import torch
x = torch.tensor([1, 2, 3, 4, 5])
indices = torch.where(x > 2) # 找到大于2的元素的索引
selected = x[indices] # 根据索引选择元素
print(selected)输出:
tensor([3, 4, 5])import torch
x = torch.tensor([1, 2, 3, 4, 5])
y = torch.tensor([10, 20, 30, 40, 50])
condition = torch.tensor([True, False, True, False, True])
result = torch.where(condition, x, y) # 根据条件选择x或y中的元素
print(result)输出:
tensor([ 1, 20, 3, 40, 5])import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
indices = torch.tensor([0, 4, 8])
selected = torch.take(x, indices)
print(selected)输出:
tensor([1, 5, 9])import torch
x = torch.tensor([0, 1, 0, 2, 3, 0])
indices = torch.nonzero(x)
print(indices)输出:
tensor([[1],
[3],
[4]])
import torch
x = torch.tensor([1, 2, 3, 4, 5])
subset = x[1:4] # 获取索引1到3的子集
print(subset)输出:
tensor([2, 3, 4])import torch
x = torch.tensor([1, 2, 3, 4, 5])
reverse = x[1:5:2]
print(reverse)输出:
tensor([2, 4])除了基本的切片操作外,还可以使用逗号将多个切片组合在一起,实现对不同维度的切片操作。
import torch
tensor = torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 使用高级切片选择子集
advanced_slice = tensor[1:, ::2]
print("高级切片选择的子集:\n", advanced_slice)tensor([[4, 6],
[7, 9]])使用高级切片选择了张量中从第二行开始到最后一行的子集,并且每隔一列选择一个元素。
import torch
x = torch.tensor([
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
])
subset = x[..., 0] # 访问所有维度的第0个元素
print(subset)输出:
tensor([[1, 3],
[5, 7]])import torch
x = torch.tensor([1, 2, 3, 4, 5])
indices = torch.tensor([0, 2, 4])
selected = torch.index_select(x, dim=0, index=indices)
print(selected)输出:
tensor([1, 3, 5])import torch
x = torch.tensor([1, 2, 3, 4, 5])
mask = torch.tensor([True, False, True, False, True])
selected = torch.masked_select(x, mask)
print(selected)输出:
tensor([1, 3, 5])