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

news2024/11/17 10:27:49

在这里插入图片描述

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.coloradmin.cn/o/1949444.html

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

相关文章

读写给大家的AI极简史笔记07读后总结与感想兼导读

1. 基本信息 写给大家的AI极简史:从图灵测试到智能物联 [德]托马斯拉姆齐 著 中国友谊出版公司,2019年9月出版 1.1. 读薄率 书籍总字数??千字,笔记总字数16382字。 读薄率16382??000≈?&a…

如何解决 Nginx 与虚拟现实设备的集成问题?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 如何解决 Nginx 与虚拟现实设备的集成问题? 如何解决 Nginx 与虚拟现实设备的集成问题? 在当今科技飞速发展的时代,虚拟现实…

钡铼网关实时数据互联,加速IEC104与MQTT云平台对接

随着工业4.0时代的到来,电力系统中的数据采集、监控与远程控制需求日益增长。IEC 104(IEC 60870-5-104)作为国际电工委员会(IEC)制定的电力自动化通信协议,广泛应用于电力系统的状态监测、数据采集和设备控…

硅纪元视角 | Stability AI推出Stable Video 4D,40秒生成8角度动态视频!

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

Sqli-labs-master的21—25通关教程

目录 Less-21(闭合) 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据 Less-22("闭合) 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据 Less-23 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据…

基于OSS前端直传的分片上传以及断点续传

一、大文件分片上传 原型 大文件如果直接上传的话由于nginx的限制会导致响应500报错,或者响应时间过长导致响应超时 并且大文件上传有如下缺点 上传时间长: 对于大文件,直接上传可能需要较长时间,特别是在网络速度较慢或不稳定的情况下。这…

深入搞懂Checkpoint调优基础及原理

前言 在执行大量写操作的系统上,调优检查点对于获得良好的性能至关重要。然而,检查点是我们经常发现混淆和配置问题的地方之一,无论是在社区邮件列表中,还是在为客户提供支持和咨询期间。这篇文章旨在解释检查点是什么——目的和数据库如何实现它——以及如何调优它们。 注…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

如何解决 Nginx 与无服务器架构的集成问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 在当今的云计算时代&#xff0c;无服务器架构因…

AI有关的学习和python

一、基本概念 AIGC&#xff08;AI Generated content AI 生成内容&#xff09; AI生成的文本、代码、图片、音频、视频。都可以成为AIGC。 Generative AI&#xff08;生成式AI&#xff09;所生成的内容就是AIGC AI指代计算机人工智能&#xff0c;模仿人类的智能从而解决问题…

JAVA中的泛型机制详解

1.泛型的概念 java泛型是java5引入的一个特性&#xff0c;它允许我们为类&#xff0c;接口&#xff0c;方法指定类型参数&#xff0c;从而提供编译时类型安全检查。泛型的本质是参数化类型&#xff0c;即在声明类&#xff0c;接口或者方法时不指定具体的类型&#xff0c;而是使…

sed利用脚本处理文件

一、sed是什么 sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编 辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 二、sed的原理 读入新的一行内容到缓存空间&#xff1b; 从指定的操作指令中取出第一条指令&…

C++ 列式内存布局数据存储格式 Arrow

Apache Arrow 优点 : 高性能数据处理&#xff1a; Arrow 使用列式内存布局&#xff0c;这特别适合于数据分析和查询操作&#xff0c;因为它允许对数据进行高效批量处理&#xff0c;减少CPU缓存未命中&#xff0c;从而提升处理速度。 零拷贝数据共享&#xff1a; Arrow …

【PyTorch】基于YOLO的多目标检测项目(一)

【PyTorch】基于YOLO的多目标检测项目&#xff08;一&#xff09; 【PyTorch】基于YOLO的多目标检测项目&#xff08;二&#xff09; 目标检测是对图像中的现有目标进行定位和分类的过程。识别的对象在图像中显示有边界框。一般的目标检测方法有两种&#xff1a;基于区域提议的…

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统

PACS&#xff0c;即图像存储与传输系统&#xff0c;是应用于医院中管理医疗设备如CT&#xff0c;MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动&#xff0c;集成了医疗设备&#xff0c;图像存储和分发&#xff0c;数字图像在重要诊断和会诊时的显示&a…

unity ui toolkit的使用

UIToolkitExamples (github)样例 GitHub - ikewada/UIToolkitExamples: チュートリアル動画「使ってみようUI Toolkit」のためのサンプルプロジェクトです官网 Unity - Manual: UI Toolkit视频教程 使用 UI Toolkit - 上集_哔哩哔哩_bilibili 使用 UI Toolkit - 下集_哔哩哔哩_…

vue3前端开发-小兔鲜项目-使用pinia插件完成token的本地存储

vue3前端开发-小兔鲜项目-使用pinia插件完成token的本地存储&#xff01;实际业务开发中&#xff0c;token是一个表示着用户登录状态的重要信息&#xff0c;它有自己的生命周期。因此&#xff0c;这个参数值必须实例化存储在本地中。不能跟着pinia。因为pinia是基于内存设计的模…

go语言day18 reflect反射

Golang-100-Days/Day16-20(Go语言基础进阶)/day19_Go语言反射.md at master rubyhan1314/Golang-100-Days (github.com) 一、interface接口 接口类型内部存储了一对pair(value,Type) type interface { type *Type // 类型信息 data unsafe.Pointer // 指向具体数据 } 1)创建R…

Git基本原理讲解、常见命令、Git版本回退、Git抛弃本地分支拉取仓库最新分支

借此机会写篇博客汇总一下自己去公司实习之后遇到的一些常见关于Git的操作。 Git基本认识 Git把数据看作是对小型文件系统的一组快照&#xff0c;每次提交更新&#xff0c;或在Git中保存项目状态时&#xff0c;Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时…