首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【深度学习】Pytorch 教程(十一):PyTorch数据结构:4、张量操作(2):索引和切片操作

【深度学习】Pytorch 教程(十一):PyTorch数据结构:4、张量操作(2):索引和切片操作

作者头像
Qomolangma
发布2024-07-30 11:15:35
发布2024-07-30 11:15:35
8310
举报
文章被收录于专栏:深度学习深度学习

一、前言

  本文将介绍PyTorch中张量的索引和切片操作。

二、实验环境

  本系列实验使用如下环境

代码语言:javascript
复制
conda create -n DL python==3.11
代码语言:javascript
复制
conda activate DL
代码语言:javascript
复制
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

三、PyTorch数据结构

1、Tensor(张量)

  Tensor(张量)是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。

1. 维度(Dimensions)

  Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。在PyTorch中,可以使用size()方法获取张量的维度信息,使用dim()方法获取张量的轴数。

2. 数据类型(Data Types)

  PyTorch中的张量可以具有不同的数据类型:

  • torch.float32或torch.float:32位浮点数张量。
  • torch.float64或torch.double:64位浮点数张量。
  • torch.float16或torch.half:16位浮点数张量。
  • torch.int8:8位整数张量。
  • torch.int16或torch.short:16位整数张量。
  • torch.int32或torch.int:32位整数张量。
  • torch.int64或torch.long:64位整数张量。
  • torch.bool:布尔张量,存储True或False。

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)

3. GPU加速(GPU Acceleration)

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

2、张量的数学运算

  PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。

1. 向量运算

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

2. 矩阵运算

【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)

3. 向量范数、矩阵范数、与谱半径详解

【深度学习】Pytorch 系列教程(五):PyTorch数据结构:2、张量的数学运算(3):向量范数(0、1、2、p、无穷)、矩阵范数(弗罗贝尼乌斯、列和、行和、谱范数、核范数)与谱半径详解

4. 一维卷积运算

【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)

5. 二维卷积运算

【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

6. 高维张量

【深度学习】pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~ 四维张量;conv3d~五维张量)

3、张量的统计计算

【深度学习】Pytorch教程(九):PyTorch数据结构:3、张量的统计计算详解

4、张量操作

1. 张量变形

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量变形

2. 索引

  在PyTorch中,可以使用索引和切片操作来访问和修改张量的特定元素或子集。

a. 使用整数索引访问单个元素
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
element = x[0]  # 访问第一个元素
print(element)

输出:

代码语言:javascript
复制
tensor(1)
b. 使用多个整数索引访问多个元素
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
elements = x[[0, 2, 4]]  # 访问第1、3、5个元素
print(elements)

输出:

代码语言:javascript
复制
tensor([1, 3, 5])
c. 使用负数索引从张量的末尾开始计数
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
print(x[-1])  # 访问最后一个元素

输出:

代码语言:javascript
复制
tensor(5)
d. 使用布尔索引访问满足条件的元素
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
mask = x > 2  # 创建一个布尔掩码
elements = x[mask]  # 访问大于2的元素
print(elements)

输出:

代码语言:javascript
复制
tensor([3, 4, 5])
e. torch.where()函数根据条件选择元素
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
indices = torch.where(x > 2)  # 找到大于2的元素的索引
selected = x[indices]  # 根据索引选择元素
print(selected)

输出:

代码语言:javascript
复制
tensor([3, 4, 5])
代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
tensor([ 1, 20,  3, 40,  5])
f. torch.take()函数按索引从张量中选择元素
代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
tensor([1, 5, 9])
g. torch.nonzero()函数找到张量中非零元素的索引
代码语言:javascript
复制
import torch

x = torch.tensor([0, 1, 0, 2, 3, 0])
indices = torch.nonzero(x)
print(indices)

输出:

代码语言:javascript
复制
tensor([[1],
        [3],
        [4]])
3. 切片操作
a. 使用start:end切片操作访问子集
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
subset = x[1:4]  # 获取索引1到3的子集
print(subset)

输出:

代码语言:javascript
复制
tensor([2, 3, 4])
b. 使用start🔚step切片操作访问子集
代码语言:javascript
复制
import torch

x = torch.tensor([1, 2, 3, 4, 5])
reverse = x[1:5:2]
print(reverse)

输出:

代码语言:javascript
复制
tensor([2, 4])
c. 高级切片

  除了基本的切片操作外,还可以使用逗号将多个切片组合在一起,实现对不同维度的切片操作。

代码语言:javascript
复制
import torch
 
tensor = torch.tensor([[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]])
 
# 使用高级切片选择子集
advanced_slice = tensor[1:, ::2]
print("高级切片选择的子集:\n", advanced_slice)
  • 输出:
代码语言:javascript
复制
tensor([[4, 6],
        [7, 9]])

使用高级切片选择了张量中从第二行开始到最后一行的子集,并且每隔一列选择一个元素。

d. 使用省略号表示连续的维度
代码语言:javascript
复制
import torch

x = torch.tensor([
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]]
])
subset = x[..., 0]  # 访问所有维度的第0个元素
print(subset)

输出:

代码语言:javascript
复制
tensor([[1, 3],
        [5, 7]])
e. torch.index_select()函数按索引从张量中选择子集
代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
tensor([1, 3, 5])
f. torch.masked_select()函数根据掩码从张量中子集
代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
tensor([1, 3, 5])
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、实验环境
  • 三、PyTorch数据结构
    • 1、Tensor(张量)
      • 1. 维度(Dimensions)
      • 2. 数据类型(Data Types)
      • 3. GPU加速(GPU Acceleration)
    • 2、张量的数学运算
      • 1. 向量运算
      • 2. 矩阵运算
      • 3. 向量范数、矩阵范数、与谱半径详解
      • 4. 一维卷积运算
      • 5. 二维卷积运算
      • 6. 高维张量
    • 3、张量的统计计算
    • 4、张量操作
      • 1. 张量变形
      • 2. 索引
      • 3. 切片操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档