当前位置: 首页 > news >正文

【pytorch-02】:张量的索引、形状操作和常见运算函数

文章目录

  • 1 张量索引
    • 1.1 简单行列索引和列表索引
    • 1.2 布尔索引和多维索引
  • 2 张量的形状操作
    • 2.1 reshape函数
    • 2.2 transpose和permute函数的使用
    • 2.3 view和contiguous函数
    • 2.4 squeeze和unsqueeze函数用法
    • 2.5 张量更改形状小结
  • 3 常见运算函数

1 张量索引

1.1 简单行列索引和列表索引

import torch# 1. 简单行列索引
def test01():# 固定随机数种子torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])print(data)print('-' * 30)# 1.1 获得指定的某行元素# print(data[2])# 1.2 获得指定的某个列的元素# 逗号前面表示行, 逗号后面表示列# 冒号表示所有行或者所有列# print(data[:, :])# 表示获得第3列的元素print(data[:, 2])# 获得指定位置的某个元素print(data[1, 2], data[1][2])# 表示先获得前三行,然后再获得第三列的数据print(data[:3, 2])# 表示获得前三行的前两列print(data[:3, :2])# 2. 列表索引
def test02():# 固定随机数种子torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])print(data)print('-' * 30)# 如果索引的行列都是一个1维的列表,那么两个列表的长度必须相等# print(data[[0, 1, 2], [2, 4]]) # 报错,索引位置都是一维,必须匹配# 解决方法:如果不想前后维数一样,就采用二维数组# 使用二维数组进行索引得到仍然为二维数组print(data[[[0],[1],[2]],[2,4]])# 1.表示获得 (0, 0)、(2, 1)、(3, 2) 三个位置的元素# 使用一维数组进行索引,得到的是一维print(data[[0, 2, 3], [0, 1, 2]])# 2。表示获得 0、2、3 行的 0、1、2 列# print(data[[[0], [2], [3]], [0, 1, 2]])

1.2 布尔索引和多维索引

import torch# 1. 布尔索引
def test01():torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])print(data)# 1. 希望能够获得该张量中所有大于3的元素# 所有元素与3进行比较,大于返回True,小于返回False# 返回一个布尔类型的张量print(data > 3)# 对于张量中的所有元素进行筛选,变为一维的张量print(data[data > 3])# 2. 希望返回第2列元素大于6的行# 先获取到第二列数据,然后进行比较,得到布尔张量# 然后再进行行索引# 想要获取到行,在行索引的位置传入布尔张量print(data[:,1] > 6) # tensor([ True,  True, False, False])print(data[data[:, 1] > 6]) # 选择前两行# 3. 希望返回第2行元素大于3的所有列# 想要获取到列,在列的位置传入布尔索引print(data[:, data[1] > 3])# 2. 多维索引
def test02():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])print(data)print('-' * 30)# 按照第0个维度选择第0元素,4行5列元素print(data[0, :, :])print('-' * 30)# 按照第1个维度选择第0元素print(data[:, 0, :])print('-' * 30)# 按照第2个维度选择第0元素print(data[:, :, 0])print('-' * 30)

2 张量的形状操作

2.1 reshape函数

  • 保证张量元素个数不变的情况下改变张量的形状
  • 在神经网络中,不同层中的数据形状不同
import torchdef test():torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])# 查看张量的形状print(data.shape, data.shape[0], data.shape[1])# print(data.size(), data.size(0), data.size(1)) # 与上述方法结果一致# 修改张量的形状new_data = data.reshape(2, 10)print(new_data)# 注意: 转换之后的形状元素个数得等于原来张量的元素个数# 原来有多少个元素,转换之后就有多少个元素# new_data = data.reshape(1, 10)# print(new_data)# 使用-1代替省略的形状# 转换为指定的行数,列数指定为-1,可以进行自动匹配列数new_data = data.reshape(5, -1)print(new_data)# 转换为两列,自动进行计算行数new_data = data.reshape(-1, 2)print(new_data)

2.2 transpose和permute函数的使用

  • reshape函数更改形状,reshape会重新计算张量的维度,有时候不需要重新计算张量的维度,只要调整张量维度的顺序即可,可以使用transpose函数和permute函数
  • transpose函数每次只能交换两个维度
  • permute函数可以一次交换多个维度
import torch# 1. transpose 函数
def test01():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])new_data = data.reshape(4, 3, 5)print(new_data.shape) # torch.Size([4, 3, 5])# 直接交换两个维度的值new_data = torch.transpose(data, 0, 1)print(new_data.shape) # torch.Size([4, 3, 5])# 缺点: 一次只能交换两个维度# 把数据的形状变成 (4, 5, 3)# 进行第一次交换: (4, 3, 5)# 进行第二次交换: (4, 5, 3)new_data = torch.transpose(data, 0, 1)new_data = torch.transpose(new_data, 1, 2)print(new_data.shape)# 2. permute 函数
def test02():torch.manual_seed(0)data = torch.randint(0, 10, [3, 4, 5])# permute 函数可以一次性交换多个维度new_data = torch.permute(data, [1, 2, 0])print(new_data.shape)

2.3 view和contiguous函数

  • view函数改变张量的形状,只能用于存储在整块内存中的张量,具有一定的局限性。
  • pytorch中有些张量是由不同的数据块组成,并没有存储在整块的内存中,view函数无法对于这种张量进行变形处理
  • 一个张量经过了transpose或者permute函数的处理之后,就无法使用view函数进行形状操作
  • 先用contiguous将非连续内存空间转换为连续内存空间,然后再使用view函数进行更改张量形状
import torch# 1. view 函数的使用
def test01():data = torch.tensor([[10, 20, 30], [40, 50, 60]])data = data.view(3, 2)print(data.shape)# is_contiguous 函数来判断张量是否是连续内存空间(整块的内存)print(data.is_contiguous())# 2. view 函数使用注意
def test02():# 当张量经过 transpose 或者 permute 函数之后,内存空间基本不连续# 此时,必须先把空间连续,才能够使用 view 函数进行张量形状操作data = torch.tensor([[10, 20, 30], [40, 50, 60]])print('是否连续:', data.is_contiguous())data = torch.transpose(data, 0, 1)print('是否连续:', data.is_contiguous())# 此时,在不连续内存的情况使用 view 会怎么样呢?data = data.contiguous().view(2, 3)print(data) 

2.4 squeeze和unsqueeze函数用法

  • squeeze函数可以将维度为1的维度进行删除
  • unsqueeze函数给张量增加维度为1的维度
import torch# 1. squeeze 函数使用
def test01():# 四维张量data = torch.randint(0, 10, [1, 3, 1, 5])print(data.shape)# 维度压缩, 默认去掉所有的1的维度# squeeze() - 默认去掉所有维度为1的函数# squeeze(0) - 删除第一个位置的为1的维度# 传入维度的索引值new_data = data.squeeze(0)print(new_data.shape)  # torch.Size([3, 5])# 指定去掉某个1的维度new_data = data.squeeze(2)print(new_data.shape)# 2. unsqueeze 函数使用
def test02():data = torch.randint(0, 10, [3, 5])print(data.shape) # torch.Size([1, 3, 1, 5])# 可以在指定位置增加维度# -1 代表最后一个维度new_data = data.unsqueeze(-1)print(new_data.shape)

2.5 张量更改形状小结

  1. reshape 函数可以在保证张量数据不变的前提下改变数据的维度.
  2. transpose 函数可以实现交换张量形状的指定维度, permute 可以一次交换更多的维度.
  3. view 函数也可以用于修改张量的形状, 但是它要求被转换的张量内存必须连续,所以一般配合 contiguous 函数使用.
  4. squeeze 和 unsqueeze 函数可以用来增加或者减少维度.

3 常见运算函数

  • mean()
  • sum()
  • pow(n)
  • sqrt()
  • exp()
  • log() - 以e为底的对数
  • log2()
  • log10()
import torch# 1. 均值
def test01():torch.manual_seed(0)# data = torch.randint(0, 10, [2, 3], dtype=torch.float64)data = torch.randint(0, 10, [2, 3]).double()# print(data.dtype)print(data)# 默认对所有的数据计算均值print(data.mean())# 按指定的维度计算均值print(data.mean(dim=0)) # 竖向计算 按列计算print(data.mean(dim=1)) # 横向计算 按行计算# 2. 求和
def test02():torch.manual_seed(0)data = torch.randint(0, 10, [2, 3]).double()print(data.sum())print(data.sum(dim=0))print(data.sum(dim=1))# 3. 平方
def test03():torch.manual_seed(0)data = torch.randint(0, 10, [2, 3]).double()print(data)data = data.pow(2)print(data)# 4. 平方根
def test04():torch.manual_seed(0)data = torch.randint(0, 10, [2, 3]).double()print(data)data = data.sqrt()print(data)# 5. e多少次方
def test05():torch.manual_seed(0)data = torch.randint(0, 10, [2, 3]).double()print(data)data = data.exp()print(data)# 6. 对数
def test06():torch.manual_seed(0)data = torch.randint(0, 10, [2, 3]).double()print(data)data = data.log()     # 以e为底data = data.log2()    # 以2为底data = data.log10()   # 以10为底print(data)

相关文章:

【pytorch-02】:张量的索引、形状操作和常见运算函数

文章目录 1 张量索引1.1 简单行列索引和列表索引1.2 布尔索引和多维索引 2 张量的形状操作2.1 reshape函数2.2 transpose和permute函数的使用2.3 view和contiguous函数2.4 squeeze和unsqueeze函数用法2.5 张量更改形状小结 3 常见运算函数 1 张量索引 1.1 简单行列索引和列表索…...

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…...

css 使用图片作为元素边框

先看原始图片 再看效果 边框的四个角灭有拉伸变形,但是图片的中部是拉伸的 代码 border-style: solid;/* 设置边框图像的来源 */border-image-source: url(/static/images/mmwz/index/bk_hd3x.png);/* 设置如何切割图像 */border-image-slice: 66;/* 设置边框的宽度 */border…...

Linux无sudo权限将zsh作为默认shell

由于我只有用户权限&#xff0c;没有sudo权限&#xff0c;将zsh作为用户默认shell需要密码&#xff0c;所以没法在系统层面进行操作&#xff0c;下面另寻他法。 安装zsh 可以根据网上教程去安装zsh&#xff0c;一般电脑上会带有zsh&#xff0c;可以使用下述命令查看是否安装z…...

【React 进阶】掌握 React18 全部 Hooks

一、数据更新驱动 1. useState 1. 基础介绍 useState主要用于声明和操作状态变量&#xff0c;可以使函数组件像类组件一样拥有state const [state, setState] useState(initialState);state&#xff1a;状态&#xff0c;作为渲染视图的数据源 setState&#xff1a;改变st…...

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; 文章目录 数据预测概念和适用方式线性系统的适用性 数据预测算法和卡尔曼滤波公式推导状态空间方程和观测器先验估计后验估计…...

【SQL50】day 2

目录 1.每位经理的下属员工数量 2.员工的直属部门 3.判断三角形 4.上级经理已离职的公司员工 5.换座位 6.电影评分 7.修复表中的名字 8.患某种疾病的患者 9.删除重复的电子邮箱 1.每位经理的下属员工数量 # Write your MySQL query statement below #e1是经理&#xff0c;…...

【内存管理】理解 `WeakReference` 以更好地管理 Android 应用中的内存

在 Android 应用开发中&#xff0c;内存管理至关重要。糟糕的内存管理可能导致“内存泄漏”&#xff0c;即一些不再需要的对象仍然留在内存中&#xff0c;最终导致性能下降&#xff0c;甚至应用崩溃。WeakReference 就是帮助解决这个问题的一种工具。在本文中&#xff0c;我们将…...

解决IDEA中Maven管理界面不是层级结构的问题

文章目录 0. 前言1. 点击Maven管理界面右上角的三个点2. 勾选将模块分组3. 分组后的层级结构 更多 IDEA 的使用技巧可查看 IDEA 专栏中的文章&#xff1a;IDEA 0. 前言 在 IDEA 中&#xff0c;如果项目中有很多子模块&#xff0c;每个子模块中又有一个或多个子模块时&#xf…...

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…...

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理&#xff0c;希望对读者有所帮助。 前置知识&#xff1a; 深度学习基础练习&#xff1a;从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…...

141. Sprite标签(Canvas作为贴图)

上节课案例创建标签的方式&#xff0c;是把一张图片作为Sprite精灵模型的颜色贴图,本节给大家演示把Canvas画布作为Sprite精灵模型的颜色贴图&#xff0c;实现一个标签。 注意&#xff1a;本节课主要是技术方案讲解&#xff0c;默认你有Canvas基础&#xff0c;如果没有Canvas基…...

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…...

python中的OS模块的基本使用

&#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64f;&#x1f64f;&#x1f64f; 文章目录…...

【Qt】QComboBox设置默认显示为空

需求 使用QComboBox&#xff0c;遇到一个小需求是&#xff0c;想要设置未点击出下拉列表时&#xff0c;内容显示为空。并且不想在下拉列表中添加一个空条目。 实现 使用setPlaceholderText()接口。我们先来看下帮助文档&#xff1a; 这里说的是&#xff0c;placeholderText是…...

LeetCode - #139 单词拆分

文章目录 前言摘要1. 描述2. 示例3. 答案题解动态规划的思路代码实现代码解析1. **将 wordDict 转换为 Set**2. **初始化 DP 数组**3. **状态转移方程**4. **返回结果** **测试用例**示例 1:示例 2:示例 3: 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗…...

服务器作业4

[rootlocalhost ~]# vim 11.sh #关闭防火墙 systemctl stop firewalld setenforce 0 #1.接收用户部署的服务名称 read -p "服务名称:(nginx)" server_name if [ $server_name ! nginx ];then echo "输入的不是nginx,脚本退出" exit 1 fi # 判断是…...

IOC控制反转---相关的介绍和6大注解解读(类注解+方法注解)

文章目录 1.传统方式造车2.传统方法的弊端3.IOC的引入3.IOC对于图书管理系统进行改进&#xff08;初识&#xff09;4.注解的使用说明4.1controller注解4.2service注解4.3component注解4.4关于spring命名的问题4.5component重命名4.6repository注解4.7configuration注解4.8注解之…...

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景&#xff1a;后端发送邮件需要时间&#xff0c;前端若响应不动会导致体验感不佳&#xff0c;一般会采用多线程的方式去处理这些任务&#xff0c;但每次都需要自己去手动编写多线程来实现 1、编写servic…...

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验&#xff0c;这里想写一下我配置机器学习的anaconda环境的二三事 一、首先&#xff0c;下载安装包&#xff1a; Download Now | Anaconda 二、打开安装包&#xff0c;一直点NEXT进行安装 这里要记住你要下载安装的路径在哪&#xff0c;后续配置环境…...

java 可以跨平台的原因是什么?

我们对比一个东西就可以了&#xff0c;那就是chrome浏览器。 MacOS/Linux/Windows上的Chrome浏览器&#xff0c;那么对于HTML/CSS/JS的渲染效果都一样的。 我们就可以认为ChromeHTML/CSS/JS是跨平台的。 这里面&#xff0c;HTML/CSS/JS是不变的的&#xff0c;对于一个网页&a…...

Solana应用开发常见技术栈

编程语言 Rust Rust是Solana开发中非常重要的编程语言。它具有高性能、内存安全的特点。在Solana智能合约开发中&#xff0c;Rust可以用于编写高效的合约代码。例如&#xff0c;Rust的所有权系统可以帮助开发者避免常见的内存错误&#xff0c;如悬空指针和数据竞争。通过合理利…...

npm | Yarn | pnpm Node.js包管理器比较与安装

一、包管理器比较 参考原文链接&#xff1a; 2024 Node.js Package Manager 指南&#xff1a;npm、Yarn、pnpm 比较 — 2024 Node.js Package Manager Guide: npm, Yarn, pnpm Compared (nodesource.com) 以下是对 Node.js 的三个包管理工具 npm、Yarn 和 pnpm 的优缺点总结&am…...

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…...

【团购核销】抖音生活服务商家应用快速接入②——商家授权

文章目录 一、前言二、授权流程三、授权Url3.1 Url参数表3.2 授权能力表3.3 源码示例 四、授权回调4.1 添加授权回调接口4.2 授权回调接口源码示例 五、实际操作演示六、参考 一、前言 目的&#xff1a;将抖音团购核销的功能集成到我们自己开发的App和小程序中 【团购核销】抖音…...

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…...

vue2中使用three.js步骤

1.使用npm 下载依赖这里以0.158.0版本为例 npm install three0.158.0 --save 2. <template><div id"container"></div> </template><script> import * as THREE from three; import { OBJLoader } from three/examples/jsm/loaders/O…...

部落商城App开发笔记 2024.11.21 实现进入app就是短视频

初步效果: 基于图鸟UI二次开发, 这里静态资源没有加载, 我在本机上安装了一个nginx, 需要启动一下. PS C:\dev\nginx-1.26.2> start .\nginx.exe重新刷新就有数据了. 先看看目前的页面吧. 首页. 分类: 发现. 消息. 购物车. 我的. 这个项目是有短视频的功能…...

解决.DS_Store 在项目一致无法排除,.gitignore里也不生效

.DS_Store 是 macOS 操作系统创建的隐藏文件&#xff0c;通常用于存储目录的属性&#xff0c;比如视图设置、图标位置等。它通常不应包含在代码仓库中&#xff0c;因此需要排除它。你提到即使将其添加到 .gitignore 文件中&#xff0c;仍然无法排除它&#xff0c;可能是由于以下…...

MySQL-关键字执行顺序

&#x1f496;简介 在MySQL中&#xff0c;SQL查询语句的执行遵循一定的逻辑顺序&#xff0c;即使这些关键字在SQL语句中的物理排列可能有所不同。 &#x1f31f;语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…...