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 绘图库 Matplotlib 入门教程
Apr 19 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
Python3如何对urllib和urllib2进行重构
Nov 25 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
python 实现一个简单的线性回归案例
Dec 17 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 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代码DOS造成用光网络带宽
2011/03/01 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
php curl发送请求实例方法
2019/08/01 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
小程序实现留言板
2018/11/02 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
详解Python_shutil模块
2019/03/15 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
运动会闭幕式解说词
2014/02/21 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书