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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
python迭代器与生成器详解
Mar 10 Python
Python递归函数定义与用法示例
Jun 02 Python
Python set常用操作函数集锦
Nov 15 Python
Python人脸识别初探
Dec 21 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
python3 实现验证码图片切割的方法
Dec 07 Python
Pandas分组与排序的实现
Jul 23 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
python ansible自动化运维工具执行流程
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设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
原生js实现二级联动菜单
2019/11/27 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
小程序实现录音功能
2020/09/22 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
简单了解python代码优化小技巧
2019/07/08 Python
python基础教程之while循环
2019/08/14 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python 如何实现访问者模式
2020/07/28 Python
Gap英国官网:Gap UK
2018/07/18 全球购物
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
军训教官感言
2014/03/02 职场文书
生日寄语大全
2014/04/08 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
Python办公自动化PPT批量转换操作
2021/09/15 Python