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 相关文章推荐
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
Python中xml和json格式相互转换操作示例
Dec 05 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python利用re,bs4,requests模块获取股票数据
Jul 29 Python
python处理document文档保留原样式
Sep 23 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
Python pymsql模块的使用
Sep 07 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
python opencv将多个图放在一个窗口的实例详解
Feb 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
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php中动态修改ini配置
2014/10/14 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
js类型检查实现代码
2010/10/29 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
50行Python代码实现人脸检测功能
2018/01/23 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Django实现celery定时任务过程解析
2020/04/21 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
应届生污水处理求职信
2013/11/06 职场文书
机械专业应届生求职信
2013/12/12 职场文书
粗加工管理制度
2014/02/04 职场文书
个人自荐书范文
2015/03/09 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
Python作用域和名称空间的详细介绍
2022/04/13 Python