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 UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
Python Socket使用实例
Dec 18 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
Django如何使用jwt获取用户信息
Apr 21 Python
python属于解释型语言么
Jun 15 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
PyTorch安装与基本使用详解
Aug 31 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
深入浅析Django MTV模式
Sep 04 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
留言板翻页的实现详解
2006/10/09 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
python实现感知器
2017/12/19 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
如何在sublime编辑器中安装python
2020/05/20 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
小学教师岗位职责
2013/11/25 职场文书
企业给企业的表扬信
2014/01/13 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
关于EntityWrapper的in用法
2022/03/22 Java/Android
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL