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 29 Python
通过python下载FTP上的文件夹的实现代码
Feb 10 Python
python之wxPython应用实例
Sep 28 Python
Python实现简单的可逆加密程序实例
Mar 05 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
python3+PyQt5实现拖放功能
Apr 24 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
python集合的新增元素方法整理
Dec 07 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下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
js tab 选项卡
2009/04/26 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python中的随机函数小结
2018/01/27 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python中反射和描述器总结
2018/09/23 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
在django中,关于session的通用设置方法
2019/08/06 Python
python 公共方法汇总解析
2019/09/16 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
python中threading开启关闭线程操作
2020/05/02 Python
python如何运行js语句
2020/09/09 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
干部选拔任用方案
2014/05/26 职场文书
工程款催款函
2015/06/24 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs