Pytorch使用教学4-张量的索引

在这里插入图片描述

1 张量的符号索引

张量也是有序序列,我们可以根据每个元素在系统内的顺序位置,来找出特定的元素,也就是索引。

1.1 一维张量的索引

一维张量由零维张量构成

一维张量索引与Python中的索引一样是是从左到右,从0开始的,遵循格式为[start: end: step]

t1 = torch.arange(1, 11)
t1
# tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])# 取出索引位置是0的元素
t1[0]
# tensor(1)

:张量索引出的结果是零维张量,而不是单独的数。要转化成单独的数还需使用上节介绍的item()方法。

可理解为构成一维张量的是零维张量,而不是单独的数。

张量的step必须大于0

# 索引3-10号元素,左闭右开,默认step为1
t1[2: 8]
# tensor([3, 4, 5, 6, 7, 8])# step=3,隔3个数取一个,左闭右开
t1[2: 8: 2]
# tensor([3, 5, 7])

Python中,step可以为负数,例如:

li = [1, 2, 3]
# 列表倒叙排列,取所有数值,从后往前取
li[ ::-1]
# [3, 2, 1]

但在张量中,step必须大于1,否则就会报错。

t1 = torch.arange(1, 11)
t1[ ::-1]
# ValueError: step must be greater than zero

1.2 二维张量的索引

二维张量的索引逻辑和一维张量的索引逻辑相同,二维张量可以视为两个一维张量组合而成。

t2 = torch.arange(1, 17).reshape(4, 4)
t2
#tensor([[ 1,  2,  3,  4],
#        [ 5,  6,  7,  8],
#        [ 9, 10, 11, 12],
#        [13, 14, 15, 16]])

t2[0,1]也可用t2[0][1]的表示。

# 表示索引第一行、第二个(第二列的)元素
t2[0, 1]
# tensor(2)t2[0][1]
# tensor(2)

但是t2[::2, ::2]t2[::2][ ::2]的索引结果就不同:

t2[::2, ::2]
# tensor([[ 1,  3],
#        [ 9, 11]])t2[::2][::2]
# tensor([[1, 2, 3, 4]])

t2[::2, ::2]二维索引使用逗号隔开时,可以理解为全局索引,取第一行和第三行的第一列和第三列的元素。

t2[::2][::2]二维索引在两个中括号中时,可以理解为先取了第一行和第三行,构成一个新的二维张量,然后在此基础上又间隔2并对所有张量进行索引。

tt = t2[::2]
# tensor([[ 1,  2,  3,  4],
#         [ 9, 10, 11, 12]])
tt[::2]
# tensor([[1, 2, 3, 4]])

1.3 三维张量的索引

设三维张量的shapex、y、z,则可理解为它是由x个二维张量构成,每个二维张量由y个一维张量构成,每个一维张量由z个元素构成。

t3 = torch.arange(1, 28).reshape(3, 3, 3)
t3
# tensor([[[ 1,  2,  3],
#         [ 4,  5,  6],
#         [ 7,  8,  9]],#         [[10, 11, 12],
#         [13, 14, 15],
#         [16, 17, 18]],#         [[19, 20, 21],
#         [22, 23, 24],
#         [25, 26, 27]]])# 索引第二个矩阵中的第二行、第二个元素
t3[1, 1, 1]
# tensor(14)# 索引第二个矩阵,行和列都是每隔两个取一个
t3[1, ::2, ::2]
# tensor([[10, 12],
#         [16, 18]])

高维张量的思路与低维一样,就是围绕张量的“形状”进行索引。

2 张量的函数索引

2.1 一维张量的函数索引

PyTorch中,我们还可以使用index_select函数指定index来对张量进行索引,index的类型必须为Tensor

index_select(dim, index)表示在张量的哪个维度进行索引,索引的位值是多少。

t1 = torch.arange(1, 11)
indices = torch.tensor([1, 2])
# tensor([1, 2])
t1.index_select(0, indices)
# tensor([2, 3])

对于t1这个一维向量来说,由于只有一个维度,第二个参数取值为0,就代表在第一个维度上进行索引,索引的位置是1和2。

:这里取出的是位置,而不是取出[1:2]区间内左闭右开的元素。

2.2 二维张量的函数索引

t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#         [ 3,  4,  5],
#         [ 6,  7,  8],
#         [ 9, 10, 11]])t2.shape
# torch.Size([4, 3])indices = torch.tensor([1, 2])
t2.index_select(0,indices)
# tensor([[3, 4, 5],
#         [6, 7, 8]])

此时dim参数取值为0,代表在shape的第一个维度上进行索引。

t2 = torch.arange(12).reshape(4, 3)
indices = torch.tensor([1, 1])
t2.index_select(1, indices)
# tensor([[ 1,  1],
#        [ 4,  4],
#        [ 7,  7],
#        [10, 10]])

此时dim参数取值为1,代表在shape的第二个维度上进行索引。index参数的值为[1,1],就代表取出第二个维度上为1的元素2次。

下面可以再次理解:

t2 = torch.arange(12).reshape(4, 3)
t2
# tensor([[ 0,  1,  2],
#         [ 3,  4,  5],
#         [ 6,  7,  8],
#         [ 9, 10, 11]])t2.shape
# torch.Size([4, 3])indices = torch.tensor([2, 2, 2])
t2.index_select(1, indices)
# tensor([[ 2,  2,  2],
#         [ 5,  5,  5],
#         [ 8,  8,  8],
#         [11, 11, 11]])

取出第二个维度上为2的元素3次。

高维张量函数索引的思路与低维一样,都是在shape的维度上进行操作。

PyTorch中很多函数都采用的是第几维的思路,后面会介绍给大家,大家还需勤加练习,适应这种思路。同时使用函数式索引,在习惯后对代码可读性会有很大提升。

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器,客户端可以从该服务器的/share目录上传并下载文件 服务端配置: 客户端测试: 2、搭建一个Web服务器,客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置: 客户端…

【Web爬虫逆向】“企业预警通”模糊查询公司信息,逆向案例实战

“企业预警通”模糊查询公司信息,逆向案例实战 功能介绍效果演示思路分析1、先找到模糊查询的接口2、分析headers与params中参数并进行构造3、JS逆向,跟栈,找到js中key和dataCategory的生成方法,并完成js补码构造4、成功还原key后…

UART编程框架详解

1. UART介绍 UART:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),简称串口。 调试:移植u-boot、内核时,主要使用串口查看打印信息 外接各种模块 1.1 硬件知识_UART硬件介绍 UART的全称是Unive…

新160个crackme - 011-wocy.1

运行分析 显示Unregister,点击注册无反应,猜测要先注册 PE分析 C 程序,32位,无壳 静态分析 ida发现关键字符串,进入关键函数 动态调试 设置断点动态调试,CWnd::UpdateData(true) :用于将屏幕上控…

MATLAB基础:数据和变量

今天我们开始学习MATLAB基础知识 1、常用非运算符及其作用 1、“,” 作为程序运行的分隔符,起到分隔语句的作用 2、“;” 同样作为分隔符,与“,”不同的是“;”会在程序运行时隐藏该行语句 如下图: 3、“...” 三个英文句点表示续行符…

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性,将pystest、selenium、allure结合起来 功能如下,web自动化,输入baidu网站,搜索“雷军”、打开网页中第一条内容 pytestsel.py如下: import time import re import allure import pytest from tools…

提升ROI:利用高级爬虫技术优化营销策略

如何通过高级爬虫技术高效提升营销ROI? 摘要: 在当今数据驱动的营销环境中,提升投资回报率(ROI)的关键在于精准洞察市场与用户行为。本文将探讨如何运用高级爬虫技术来优化营销策略,从海量互联网数据中挖掘…

【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据和2013-2022年的省市县三级的逐日SO2数据(均可查看之前的文章获悉详情)! 本次…

jmeter实战(1)- Mac环境安装

一、安装 JDK 这个就不介绍了,本地自行安装 JDK 并且配置好环境变量 二、安装 Jmeter 1. 下载地址 —> 下载链接点击这里 2. 选择合适的版本下载 3. 解压到本地目录 解压后,会得到下面的目录文件: 输入cd bin,进入到bin…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉,在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现,建议大家学习前掌握些原理基础。 …

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期,接下来学习碎片的常用操作,其中会用到上一篇文章的三个碎片,就做一个简单的说明吧:LeftFragment(包含一个按钮)、RightFragment4(以粉色为背景的文本&…

408专业课130|零基础五个月速成攻略

计算机考研,有两个选择,一个是自命题,一个是408。如果你只是考一个普通院校,可以选择考自命题院校,容易上岸,但是如果考985/211/这类院校,最好还是选择408,因为408的考风险能力很强&…

Apollo部署与简易架构梳理

文章目录 apollo 安装apollo的基本架构组件机制component编译与加载 节点通讯数据的传输消息读写的实现消息的写端消息读端 常用术语ComponentChannelTaskNodeReader/WriterService/ClientParameter服务发现CRoutineSchedulerMessageDag文件Launch文件Record文件Mainboard Moni…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题,在这个领域中,使用图神经网络(GNNs)似乎是一个自然的选择。然而,以往关于使用GNNs进行推理的工作表明,当这些模型面对需要比训练时更长推理链的测…

(leetcode学习)236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十一章 添加设备树节点

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

linux禁用root

linux禁用root 1. 禁止普通用户切换到root1.1 sudo -i和sudo -s的区别1.2 sudo -i和直接登录root账号的区别1.3 禁止sudo -i切换root1.4 禁止su - root切换root 2. 禁止root远程登录2.1 ssh禁止root登录2.2 禁止远程桌面登录 本文主要介绍: 如何禁止普通用户切换到r…

Java---后端事务管理

代码世界聚眸光,昼夜敲盘思绪长。 算法心间精构建,编程路上细思量。 屏前架构乾坤定,键上飞驰智慧扬。 默默耕耘成果现,创新科技铸辉煌。 目录 一,概念 二,Spring事务管理 三,rollbackFor事务回…

运维锅总浅析Kubernetes之Ceph

Ceph 的核心组件有哪些?Ceph读写数据流程及故障自愈是怎样的?如何对Ceph部署架构进行调优?如何用Ceph集成到kubernetes?希望本文能帮您解答这些疑惑! 一、Ceph简介 Ceph 是一个开源的分布式存储系统,旨在…

PySide(PyQt)使用QPropertyAnimation制作动态界面

主脚本: # encoding: utf-8 import os import sysfrom PySide6.QtCore import QPropertyAnimation, QEasingCurvefrom UIS import *# 主画面类 class MainWindow(QMainWindow, animationButton_ui.Ui_MainWindow):def __init__(self):super().__init__()self.setup…