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 三维张量的索引
设三维张量的shape是x、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-张量操作方法大总结
有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取

相关文章:
Pytorch使用教学4-张量的索引
1 张量的符号索引 张量也是有序序列,我们可以根据每个元素在系统内的顺序位置,来找出特定的元素,也就是索引。 1.1 一维张量的索引 一维张量由零维张量构成 一维张量索引与Python中的索引一样是是从左到右,从0开始的ÿ…...
【Git多人协作开发】同一分支下的多人协作开发模式
目录 0.前言场景 1.开发者1☞完成准备工作&协作开发 1.1创建dev分支开发 1.2拉取远程dev分支至本地 1.3查看分支情况和分支联系情况 1.4创建本地dev分支且与远程dev分支建立联系 1.5在本地dev分支上开发file.txt 1.6推送push至远程仓库 2.开发者2☞完成准备工作&…...
Vue使用FullCalendar实现日历/周历/月历
Vue使用FullCalendar实现日历/周历/月历 需求背景:项目上遇到新需求,要求实现工单以日/周/月历形式展示。而且要求不同工单根据状态显示不同颜色,一个工单内部,需要以不同颜色显示三个阶段。 效果图 日历 周历 月历 安装插件…...
社交圈子聊天交友系统搭建社交app开发:陌生交友发布动态圈子单聊打招呼群聊app介绍
系统概述 社交圈子部天交友系统是一个集成即时通讯、社区互动、用户管理等功能的在线社交平台。它支持用户创建个人资料,加入兴趣围子,通过文字、图片、语音、视频等多种方式进行交流,满足用户在不同场景下的社交需求 核心功能 -,…...
【微信小程序实战教程】之微信小程序原生开发详解
微信小程序原生开发详解 微信小程序的更新迭代非常频繁,几乎每个月都会有新版本发布,这就会让初学者感觉到学习的压力和难度。其实,我们小程序的每次版本迭代都是在现有小程序架构基础之上进行更新的,如果想要学好小程序开发技术&…...
PHP身份证实名认证接口集成守护电商购物
在这个万物互联的世界里,网购已成为日常生活中不可或缺的一部分。然而,随着线上交易的增加,如何保护消费者和商家免受欺诈,确保每一笔交易的安全,成了亟待解决的难题。这时,身份证实名认证接口应运而生&…...
为什么有了MAC还需要IP?
目录 MAC地址(Media Access Control Address)IP地址(Internet Protocol Address)为什么需要两者? IP地址和MAC地址在网络通信中扮演着不同的角色,它们各自有独特的功能和用途。下面是它们的主要区别和为什么…...
SpringBoot中如何使用RabbitMq
一,RabbitMQ简介和基本概念 RabbitMQ 是一个开源的消息中间件,基于 AMQP(高级消息队列协议)实现。 它由 Erlang 语言开发,并且支持多种编程语言,包括 Java、Python、Ruby、PHP 和 C# 等, 下载…...
LangChain自定义Embedding封装 之 ERNIE Bot
LangChain自定义Embedding封装 之 ERNIE Bot 百度飞浆平台的 ERNIE Bot 导入下面方法 和 环境 ,即可验证 embedding ERNIE_Bot_embedding() class ERNIE_Bot_embedding(BaseModel, Embeddings):client: Anyroot_validator()def validate_environment(cls, value…...
Git 安装教程
1、登录git 官方网站:https://git-scm.com/ 点击左边的 Downloads 或者 右边标识的下载标志,它根据电脑操作系统自动匹配版本 Downloads for Windows 2、以 windows 为例下载对应版本 网络有时可能不大好,阿里镜像下载超快。 下载好以后&a…...
Lua 类管理器
Lua 类管理器 -- ***** Class Manager 类管理*****‘local ClassManager {}local this ClassManagerfunction ClassManager.Class(className, ...)print(ClassManager::Class)--print(className)-- 构建类local cls {__className className}--print(cls)-- 父类集合local …...
实现领域驱动设计(DDD)系列详解:领域模型的持久化
领域驱动设计主要通过限界上下文应对复杂度,它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动,且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同,就应该在领域建模阶段率先定义领域…...
配置sublime的中的C++编译器(.sublime-build),实现C++20
GCC 4.8: 支持 C11 (部分) GCC 4.9: 支持 C11 和 C14 (部分) GCC 5: 完全支持 C14 GCC 6: 支持 C14 和 C17 (部分) GCC 7: 支持 C17 (大部分) GCC 8: 完全支持 C17,部分支持 C20 GCC 9: 支持更多的 C20 特性 GCC 10: 支持大部分 C20 特性 GCC 11: 更全面地支持 C20 …...
Android14 - 前台Service、图片选择器 、OpenJDK 17、其他适配
前台服务 1. 指定前台服务类型 以 Android 14(API 级别 34)或更高版本为目标平台的应用,需要为应用中的每项前台服务指定服务类型,因为系统需要特定类型的前台服务满足特定用例。具体介绍如下: 在Android 10 在 <service> 元素内引入了 android:foregroundServiceT…...
数据恢复教程:如何从硬盘、SD存储卡、数码相机中恢复误删除数据。
您正在摆弄 Android 设备。突然,您意外删除了一张或多张图片。不用担心,您总能找到一款价格实惠的数据恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的数据。 Android 上数据被删除的主要原因 在…...
谷粒商城实战笔记-47-商品服务-API-三级分类-网关统一配置跨域
文章目录 一,跨域问题1,跨域问题产生的原因2,预检请求3,跨域解决方案3.1 CORS (Cross-Origin Resource Sharing)后端配置示例(Spring Boot) 3.2 JSONP (JSON with Padding)3.3 代理服务器Nginx代理配置示例…...
stm32平台为例的软件模拟时间,代替RTC调试
stm32平台为例的软件模拟时间,代替RTC调试 我们在开发项目的时候,如果用到RTC,如果真正等待RTC到达指定的时间,那调试时间就太长了。 比如每隔半个小时,存储一次数据,如果要观察10次存储的效果࿰…...
《设计模式之美》读书笔记2
从Linux学习应对大型复杂项目的方法: 1、封装与抽象:封装了不同类型设备的访问细节,抽象为统一的文件访问方式,更高层的代码就能基于统一的访问方式,来访问底层不同类型的设备。这样做的好处是,隔离底层设备…...
C++ STL set_difference 用法
一:功能 给定两个集合A,B;计算集合的差集,即计算出那些只包含在A中而不包含在B中的元素。 二:用法 #include <vector> #include <algorithm> #include <iostream>int main() {std::vector<int&…...
【基础算法总结】优先级队列
优先级队列 1.最后一块石头的重量2.数据流中的第 K 大元素4.前K个高频单词4.数据流的中位数 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
