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 相关文章推荐
2款Python内存检测工具介绍和使用方法
Jun 01 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
20个常用Python运维库和模块
Feb 12 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
Python 切分数组实例解析
Nov 07 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
Python根据字符串调用函数过程解析
Nov 05 Python
Python读取图像并显示灰度图的实现
Dec 01 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 UBB 解析实现代码
2011/11/27 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
JavaScript浏览器选项卡效果
2010/08/25 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python和pyqt实现360的CLable控件
2014/02/21 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
教育学专业实习生的自我鉴定
2013/11/26 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
服装促销活动方案
2014/02/23 职场文书
钳工实训报告总结
2014/11/04 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python