Pytorch:张量的索引操作

文章目录

  • 一、索引
    • 1.使用整数索引访问单个元素
    • 2.使用多个整数索引访问多个元素*
      • a.示例详解
      • b.示例
      • c.一维索引示例
    • 3.使用负数索引从张量的末尾开始计数
    • 4.使用布尔索引访问满足条件的元素*
      • a.张量的元素级布尔操作
      • b.布尔索引示例
    • 5.torch.where()函数根据条件选择元素
      • a.函数原型
      • b.示例
    • 6. torch.take()函数按索引从张量中选择元素
      • a. .take() 函数的基本用法
      • b.示例:

参考神君

一、索引

1.使用整数索引访问单个元素

import torch
x=torch.tensor([[1,2,3],[4,5,6]])
lst = [[1,2,3],[4,5,6]]
print(x[0][1])#等价于x[0,1]
print(lst[0][1])

输出:

tensor(2)
2

2.使用多个整数索引访问多个元素*

list没有这种索引方式。这种索引方式,通过在索引中,给定多个列表或多个张量,索引按这个列表或张量的次序访问元素。

a.示例详解

考虑以下的 3x3 张量:

1 2 3
4 5 6
7 8 9

假设我们想从中选择元素 26。这两个元素分别位于:

  • 2 在第0行第1列
  • 6 在第1行第2列

要使用 fancy indexing 来选择这些元素,可以做如下操作:

import torch# 创建一个 3x3 的张量
tensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 定义行索引和列索引
rows = torch.tensor([0, 1])
columns = torch.tensor([1, 2])# 使用行索引和列索引进行选择
selected_elements = tensor[rows, columns]print(selected_elements)  # 输出 tensor([2, 6])

在上面的例子中,rowscolumns 是两个张量,分别指定了要访问的行和列的索引。当你传递 rowscolumns 到原始张量 tensor 时,PyTorch 会解释这样的索引方式:

  • 对于每对 (row, column) 索引,选择对应的元素。
  • rows[0]columns[0] 组合指定了元素 tensor[0, 1](即 2)。
  • rows[1]columns[1] 组合指定了元素 tensor[1, 2](即 6)。

这种索引非常灵活,允许你从张量中快速选择一个不规则的元素集合。这对于机器学习和数据预处理任务尤其有用,因为经常需要从数据集中提取特定的样本或特征。

b.示例

import torch
x=torch.tensor([[1,2,3],[4,5,6]])
print(x[[0,1],[1,1]])

输出:

tensor([2, 5])#x[0][1]和x[1][1]

当我们只给定一个维度的时候,也是一样的。

y=torch.tensor([1,2,3,4,5,6])
print(y[[0,1]])

输出:

tensor([1, 2]) # y[0]和y[1]

c.一维索引示例

import torch
x=torch.tensor([[1,2,3],[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6]])
print(x[[0,1,5,4,2,6,3]])

3.使用负数索引从张量的末尾开始计数

如果某个维度的索引是-1,则在该维取末尾元素。

import torch
x=torch.tensor([[1,2,3],[4,5,6]])
print(x[[0,1],[1,-1]])

输出:

tensor([2, 6])

4.使用布尔索引访问满足条件的元素*

list没有这种索引方式。

  高级索引是一种在 PyTorch 和 NumPy 中常用的索引方法,它允许你从数组或张量中选择复杂的、非连续的数据子集。高级索引可以通过传递整数数组、张量或列表来实现,而这些索引方式相比基本的切片提供了更大的灵活性。在 PyTorch 中,使用高级索引时,索引操作的结果通常会形成一个新的张量,不与原始数据共享内存。

高级索引的几种常见形式:

  1. 整数数组索引
    使用整数数组进行索引时,你可以指定要访问的每个维度上的索引位置。这种方式可以从张量中选择任意位置的数据,而这些数据可以是非连续和非规则的。

  2. 布尔(掩码)索引
    布尔索引允许你使用布尔数组(通常是逻辑条件的结果)来选择张量的元素。这种方法非常适用于基于条件的筛选。

a.张量的元素级布尔操作

在 PyTorch(以及其他类似的库,如 NumPy)中,使用张量进行布尔表达式的操作本质上是一种称为“元素级”或“元素对元素”的操作。当你在布尔表达式中使用张量时,PyTorch 会自动应用广播和矢量化操作,使得表达式能够逐元素地计算结果。这种处理方式使得代码不仅可读性好,而且效率高,非常适合科学计算和机器学习任务。

元素级布尔操作:

在 PyTorch 中,布尔操作(例如比较操作 <, >, <=, >=, ==, !=)都是元素级的。这意味着每个操作都是在输入张量的对应元素间独立进行的,并生成一个布尔类型的张量,其中的每个元素都是单个比较的结果。

原理解释:

  1. 矢量化
    矢量化是指使用优化的库例程一次处理整个数组(或张量),而不是在Python层面上使用循环处理数组的每个元素。这减少了循环的开销,提高了执行速度,尤其是在底层使用如C/C++等编译语言实现的情况下。

  2. 广播
    广播是一种灵活处理不同形状张量的方法。当在两个不同大小的张量上进行操作时,较小的张量会自动“扩展”其维度以匹配较大张量的形状。例如,如果你有一个形状为(3,1)的张量和一个形状为(1,4)的张量,那么在操作中,每个张量都会广播到(3,4)以进行元素级操作。

示例:

考虑两个张量 AB,大小分别为 (3,3)(3,)

import torchA = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
B = torch.tensor([2, 2, 2])# 元素级比较
C = A > B
print(C)

输出:

tensor([[False, False,  True],[ True,  True,  True],[ True,  True,  True]])

在这里,B 被广播到与 A 相同的形状 (3,3),每个元素的比较都是独立进行的。

b.布尔索引示例

布尔索引可以用来选择满足特定条件的元素。例如,选择张量中所有大于5的元素:

# 创建一个 3x4 的张量
tensor = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 布尔索引
mask = tensor > 5
selected_elements = tensor[mask]
print(mask)
print(selected_elements)

输出:

tensor([[False, False, False, False],[False,  True,  True,  True],[ True,  True,  True,  True]])
tensor([ 6,  7,  8,  9, 10, 11, 12])

5.torch.where()函数根据条件选择元素

torch.where() 是一个非常有用的函数,在 PyTorch 中用于根据条件从两个张量中选择元素。该函数的工作原理相似于 NumPy 中的 np.where(),允许在条件为真时从一个张量选择元素,条件为假时从另一个张量选择元素。

a.函数原型

torch.where() 函数的基本语法如下:

torch.where(condition, x, y)
  • condition: 一个布尔张量,其中的每个元素都对应于 xy 张量中相应位置的条件检查。
  • x: 当条件为真时将从这个张量中选择元素。
  • y:当条件为假时将从这个张量中选择元素。

结果张量的每个位置会根据 condition 张量在相应位置的值是真还是假,从 xy 张量中选择值。


torch.where(condition)
  • 当仅提供 condition参数时,此函数返回满足条件的元素的索引。这可以用于找出满足特定条件的所有元素的位置。返回的是一个元组,其中每个元素是一个张量,分别代表满足条件的元素在各个维度上的索引。
# 创建温度张量
temperatures = torch.tensor([-5, 13, -2, 8, -1])
condition = temperatures < 0
indexs = torch.where(condition)
corrected_temperatures = temperatures[indexs]
print(corrected_temperatures)

输出:

tensor([-5, -2, -1])

b.示例

假设有一个张量代表温度值,想要将所有低于零度的值设置为零:

# 创建温度张量
temperatures = torch.tensor([-5, 13, -2, 8, -1])# 使用 torch.where() 来修正负值
# 注意,这里的temperatures<0是之前提到的元素级布尔操作,生成的是tensor([True,False,True,False,True])
corrected_temperatures = torch.where(temperatures < 0, torch.tensor(0), temperatures)print(corrected_temperatures)

or:

# 创建温度张量
temperatures = torch.tensor([-5, 13, -2, 8, -1])
condition = temperatures < 0
indexs = torch.where(condition)
for i in indexs:temperatures[i]=0
print(temperatures)

输出:

tensor([ 0, 13,  0,  8,  0])

import torch
A = torch.tensor([5,1,2])
B = torch.tensor([2,4,7])
C = torch.where(A<B,A,B)
print(C)

输出:

tensor([2, 1, 2])

6. torch.take()函数按索引从张量中选择元素

在 PyTorch 中,.take() 函数是一个实用的张量操作,它用于从输入张量中按照指定的索引来提取元素。这个函数允许你将输入张量视为一维张量,并使用一维索引从中选择元素。这种方式特别适用于从多维张量中按特定顺序选择元素,而不必担心张量的原始维度。

a. .take() 函数的基本用法

函数如下:

tensor.take(indices)  or torch.take(tensor,indices)
  • indices:一个包含要提取的元素索引的一维张量。

这个函数按照 indices 提供的索引从输入张量中取出元素。索引假设输入张量是一维的,并按照行优先(C样式)顺序展开。

b.示例:

假设你有一个二维张量,想根据特定的索引列表从中选择元素。下面是如何使用 .take() 来实现这一点的示例:

import torch# 创建一个二维张量
tensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 定义一维索引张量
indices = torch.tensor([0, 4, 8])# 使用.take()选择元素
selected_elements = tensor.take(indices)print(selected_elements)

在这个例子中,selected_elements 将包含由 indices 指定的位置的元素。输出将是:

tensor([1, 5, 9])

这里的索引 0, 4, 8 分别对应张量展开后的第1,第5,第9个元素(考虑到从零开始索引)。

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

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

相关文章

去雾笔记01-SRKTDN: Applying Super Resolution Method to Dehazing Task

文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Network Architecture Abstract 们提出了一种结合超分辨方法和知识转移方法的模型。我们的模型由一个教师网络、一个去雾网络和一个超分辨率网络组成。 1. Introduction ECNU KT团队提出了一个知识蒸馏[20]模…

智慧养老平台|基于SprinBoot+vue的智慧养老平台系统(源码+数据库+文档)

智慧养老平台目录 基于SprinBootvue的外贸平台系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员功能 老人功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农…

控制台程序设置

该篇博客主要是对下一篇博客《贪吃蛇游戏》的设计做铺垫&#xff0c;大家可以持续关注(点个关注哦&#x1f60a;)等待更新&#xff0c;以下是个人主页&#xff1a; 敲上瘾-CSDN博客 在我们写的程序运行起来后弹出的框就是控制台程序。而这个窗口我们是可以对它进行设置的&…

终于找到恢复照片的绝佳方法了!手机照片恢复的看这里!

当今手机已经彻底离不开我们的生活&#xff0c;手机里面的数据也成为了我们高质量生活的重要构成&#xff0c;当手机内存爆满&#xff0c;我们就不得不采用清除部分手机数据的方法来释放空间。有一些数据删除后往往才发现还另有用处&#xff0c;比如手机里存储着的大量照片。 …

帆软报表实现通过js查询数据库设置表格数据

最近做的一直在做报表相关的需求&#xff0c;自己也是一边学一边做。有一个有意思的需求是在表格中某个单元格在编辑完以后其它的表格中的数据自动填充&#xff0c;当也是根据一定的规则与数据来源才能填充的。 先来点基础概念&#xff0c;就是帆软给我们提供了这个编辑后的事件…

使用Apache Cordova将H5游戏打包成apk

要将HTML5游戏转换成apk格式以供Android手机用户使用&#xff0c;有一种常用的方法是使用跨平台开发工具Apache Cordova。Cordova是一个开源框架&#xff0c;允许将网页应用程序打包为原生移动应用程序。下面是一个简单的步骤指南&#xff1a; 1. 准备工作&#xff1a;在您的电…

学习笔记:Vue2高级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 7.…

《Spring》系列文章目录

Spring Framework是一个为基于Java的现代企业应用程序提供全面编程和配置模型的开源框架。它集成了控制反转&#xff08;IOC&#xff09;、依赖注入&#xff08;DI&#xff09;和面向切面编程&#xff08;AOP&#xff09;等容器技术。Spring框架的设计理念是面向Bean编程&#…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 jar包放在web-web-inf中 Boot strap框架 container是两…

【Go语言快速上手(三)】数组, 切片与映射

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 数组详解3. 切…

平面设计简介:快速了解

在互联网飞速发展的时代&#xff0c;平面设计仍然是很多设计师的职业选择&#xff0c;平面设计也被称为设计的启蒙星。平面设计是什么&#xff0c;无论是想转行进入平面设计行业还是平面设计新秀&#xff1f;什么是平面设计&#xff1f;只有了解这一点&#xff0c;我们才能在未…

卷积层、池化层和全连接层的作用分别是什么

卷积层&#xff08;Convolutional Layer&#xff09;、池化层&#xff08;Pooling Layer&#xff09;和全连接层&#xff08;Fully Connected Layer&#xff09;是神经网络中常见的三种层类型&#xff0c;它们各自在神经网络中扮演着不同的作用&#xff1a; 卷积层&#xff1a;…

制造业信息安全实践——企业信息安全运营规划

前言 制造业作为一个庞大的传统产业&#xff0c;涵盖了汽车、船舶、飞机、家电、新能源等众多领域。当前&#xff0c;无论是国内还是国外的制造业都面临着一个共同的挑战&#xff1a;在计算机和信息时代的背景下&#xff0c;如何跟上IT技术的发展步伐&#xff1f;如何让传统产…

4月21日Linux运维用户相关的添加,分组,修改权限等shell脚本开发第一天

4月21日运维用户相关的添加&#xff0c;分组&#xff0c;修改权限等shell脚本开发第一天 第一天主要实现前2个功能 ​ 主要卡在了&#xff1a; 正确的写法如下&#xff0c;注意[]中的空格&#xff0c;要求很严格&#xff01;&#xff01;&#xff01; #!/bin/bash # 先查看已…

抖音ip地址怎么换位置

抖音&#xff0c;作为一款短视频分享平台&#xff0c;已经成为了许多人展示生活、分享才艺的重要舞台。然而&#xff0c;在抖音的使用过程中&#xff0c;你是否想过更换自己的IP地址位置呢&#xff1f;更换IP地址不仅可以帮助你访问一些地域限制的内容&#xff0c;还可以为你的…

micro-app的css样式隔离

手写微前端micro-app-CSS隔离 子应用的CSS可能会对基座应用或者其他子应用产生的影响 首先现在我们把react页面放入到vue2的页面大家也能看到一些问题了&#xff0c;在react中的index.css中对body的一些css样式&#xff0c;已经影响了基座应用的css。 为了看的更明显&#x…

Qt Android 无法加载 assets 目录下 lua 校准脚本

问题描述 C 语言使用 fopen 无法打开 assets 目录下的文件。 项目的校准脚本在打包的时候都放在 assets 资源目录下&#xff0c;但是 assets 是压缩包&#xff0c;Android 下虚拟目录&#xff0c;所以 Qt 可以加载 assets 目录下文件&#xff0c;但是 C 语言的 fropen 函数却…

Elasticsearch:(二)3.集群的健康检查

1.健康状态 green:所有primary主分片和replica副分片均为active&#xff0c;集群健康。 yellow:至少一个replica副本分片不可用&#xff0c;但是所有primary主分片均为active&#xff0c;数据仍然是可以保证完整性的。 red:至少有一个primary为不可用状态&#xff0c;数据不…

RabbitMQ学习记录

核心概念 Brocker&#xff1a;消息队列服务器实体 Exchange(消息交换机)&#xff1a;它指定消息按什么规则&#xff0c;路由到哪个队列。 Queue(消息队列载体)&#xff1a;每个消息都会被投入到一个或多个队列。 Binding(绑定)&#xff1a;它的作用就是把exchange和queue按…