当前位置: 首页 > 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;后续配置环境…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...