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 相关文章推荐
wxPython框架类和面板类的使用实例
Sep 28 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
Python贪心算法实例小结
Apr 22 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
python实现键盘控制鼠标移动
Nov 27 Python
Django自定义用户登录认证示例代码
Jun 30 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 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 SPL使用方法和他的威力
2013/11/12 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
python中get和post有什么区别
2020/06/19 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
pycharm导入源码的具体步骤
2020/08/04 Python
利用python爬取有道词典的方法
2020/12/08 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
初中学生评语大全
2014/04/24 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
写给女朋友的保证书
2015/05/09 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书