Pytorch Tensor的索引与切片例子


Posted in Python onAugust 18, 2019

1. Pytorch风格的索引

根据Tensor的shape,从前往后索引,依次在每个维度上做索引。

示例代码:

import torch
 
a = torch.rand(4, 3, 28, 28)
print(a[0].shape) #取到第一个维度
print(a[0, 0].shape) # 取到二个维度
print(a[1, 2, 2, 4]) # 具体到某个元素

上述代码创建了一个shape=[4, 3, 28, 28]的Tensor,我们可以理解为4张图片,每张图片有3个通道,每个通道是28x28的图像数据。a代表这个Tensor,a后面跟着的列表[]表示对Tensor进行索引,a的维度dim = 4,决定了[]中的元素个数不能超过4个,[]中的值表示对应维度上的哪一个元素,比如 a[0]表示取第一个维度上的第一个元素,可以理解为第一张图片,a[1]表示取第一个维度上的第二个元素,可以理解为第二张图片。a[0, 0]表示取第一个维度上第一个元素的与第二个维度上的第一个元素,也就是第一张图片第一个通道的元素。a[1, 2, 2, 4]表示取第第一个维度上的第二个元素与第二个维度上的第三个元素与第三个维度上的第三个元素与第四个维度上的第5个元素,也就是第二张图片第三个通道第三行第四列的像素值是一个标量值。

输出结果:

torch.Size([3, 28, 28])
torch.Size([28, 28])
tensor(0.1076)

2. python风格的索引

示例代码:

import torch
 
# 譬如:4张图片,每张三个通道,每个通道28行28列的像素
a = torch.rand(4, 3, 28, 28)
 
# 在第一个维度上取后0和1,等同于取第一、第二张图片
print(a[:2].shape) 
 
# 在第一个维度上取0和1,在第二个维度上取0,
# 等同于取第一、第二张图片中的第一个通道
print(a[:2, :1, :, :].shape) 
 
# 在第一个维度上取0和1,在第二个维度上取1,2,
# 等同于取第一、第二张图片中的第二个通道与第三个通道
print(a[:2, 1:, :, :].shape) 
 
# 在第一个维度上取0和1,在第二个维度上取1,2,
# 等同于取第一、第二张图片中的第二个通道与第三个通道
print(a[:2, -2:, :, :].shape) 
 
# 使用step隔行采样
# 在第一、第二维度取所有元素,在第三、第四维度隔行采样
# 等同于所有图片所有通道的行列每个一行或者一列采样
# 注意:下面的代码不包括28
print(a[:, :, 0:28:2, 0:28:2].shape) 
print(a[:, :, ::2, ::2].shape) # 等同于上面语句

注意:负值的索引即表示倒数第几个元素,-2就是倒数第二个元素。

输出结果:

torch.Size([2, 3, 28, 28])
torch.Size([2, 1, 28, 28])
torch.Size([2, 2, 28, 28])
torch.Size([2, 2, 28, 28])

3. index_select()选择特定索引

选择特定下标有时候很有用,比如上面的a这个Tensor可以看作4张RGB(3通道)的MNIST图像,长宽都是28px。那么在第一维度上可以选择特定的图片,在第二维度上选择特定的通道,在第三维度上选择特定的行等:

# 选择第一张和第三张图
print(a.index_select(0, torch.tensor([0, 2])).shape)
 
# 选择R通道和B通道
print(a.index_select(1, torch.tensor([0, 2])).shape)
 
# 选择图像的0~8行
print(a.index_select(2, torch.arange(8)).shape)

注意:index_select()的第二个索引参数必须是Tensor类型

输出结果:

torch.Size([2, 3, 28, 28])
torch.Size([4, 2, 28, 28])
torch.Size([4, 3, 8, 28])

4. 使用 ... 索引任意多的维度

import torch
 
a = torch.rand(4, 3, 28, 28)
 
# 等与a
print(a[...].shape)
 
# 第一张图片的所有维度
print(a[0, ...].shape)
 
# 所有图片第二通道的所有维度
print(a[:, 1, ...].shape)
 
# 所有图像所有通道所有行的第一、第二列
print(a[..., :2].shape)

输出结果:

torch.Size([4, 3, 28, 28])
torch.Size([3, 28, 28])
torch.Size([4, 28, 28])
torch.Size([4, 3, 28, 2])

5. 使用mask索引

示例代码:

import torch
 
a = torch.randn(3, 4)
print(a)
 
# 生成a这个Tensor中大于0.5的元素的掩码
mask = a.ge(0.5)
print(mask)
 
# 取出a这个Tensor中大于0.5的元素
val = torch.masked_select(a, mask)
print(val)
print(val.shape)

输出结果:

tensor([[ 0.2055, -0.7070, 1.1201, 1.3325],
    [-1.6459, 0.9635, -0.2741, 0.0765],
    [ 0.2943, 0.1206, 1.6662, 1.5721]])
tensor([[0, 0, 1, 1],
    [0, 1, 0, 0],
    [0, 0, 1, 1]], dtype=torch.uint8)
tensor([1.1201, 1.3325, 0.9635, 1.6662, 1.5721])
torch.Size([5])

注意:最后取出的 大于0.5的Tensor的shape已经被打平。

6. take索引

take索引是在原来Tensor的shape基础上打平,然后在打平后的Tensor上进行索引。

示例代码:

import torch
 
a = torch.tensor([[3, 7, 2], [2, 8, 3]])
print(a)
print(torch.take(a, torch.tensor([0, 1, 5])))

输出结果:

tensor([[3, 7, 2],
    [2, 8, 3]])
tensor([3, 7, 3])

以上这篇Pytorch Tensor的索引与切片例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python进阶教程之异常处理
Aug 30 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
python实现二叉树的遍历
Dec 11 Python
浅析Python装饰器以及装饰器模式
May 28 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
Python中super函数用法实例分析
Mar 18 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
如何通过python实现全排列
Feb 11 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 #Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 #Python
pytorch中的embedding词向量的使用方法
Aug 18 #Python
Pytorch加载部分预训练模型的参数实例
Aug 18 #Python
在pytorch中查看可训练参数的例子
Aug 18 #Python
浅析PyTorch中nn.Module的使用
Aug 18 #Python
关于PyTorch 自动求导机制详解
Aug 18 #Python
You might like
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
网上抓的一个特效
2007/05/11 Javascript
不同浏览器的怪癖小结
2010/07/11 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
js单例模式的两种方案
2013/10/22 Javascript
JavaScript中Function详解
2015/02/27 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
浅析Ajax语法
2016/12/05 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
python sorted函数原理解析及练习
2020/02/10 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
佳能英国官方网站:Canon UK
2017/08/08 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
计划生育证明书写要求
2014/09/17 职场文书
企业宣传语大全
2015/07/13 职场文书
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技