TensorFlow索引与切片的实现方法


Posted in Python onNovember 20, 2019

索引与切片在Tensorflow中使用的频率极其高,可以用来提取部分数据。

1.索引

在 TensorFlow 中,支持基本的[?][?]…标准索引方式,也支持通过逗号分隔索引号的索引方式。

假设创建四张大小为3*3的彩色图片。

# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 提取出第一张图片
x[0]

<tf.Tensor: id=253, shape=(32, 32, 3), dtype=float32, numpy=
array([[[ 3.16146165e-01, 1.88969020e-02, 1.38413876e-01],
    [ 4.89341050e-01, 2.75277281e+00, 7.39786148e-01],
    [-1.25965345e+00, -2.69633114e-01, -1.16465724e+00],
    ...,


# 提取出第一张图片的第二行
x[0][1]

<tf.Tensor: id=261, shape=(32, 3), dtype=float32, numpy=
array([[ 7.4337220e-01, -1.0524833e+00, -2.6401659e-03],
    [ 5.3725803e-01, -9.5556659e-01, 4.9091709e-01],
    [-4.6934509e-01, 7.9289172e-03, -2.9179385e+00],
    [ 2.9324377e-01, 2.1451252e+00, -3.8849866e-01],
    [ 8.2027388e-01, -4.9701610e-01, -7.3374517e-02],
    ......

# 提取出第一张图片的第二行第三列的像素
x[0][1][2]

<tf.Tensor: id=273, shape=(3,), dtype=float32, numpy=array([-0.4693451 , 0.00792892, -2.9179385 ], dtype=float32)>

# 提取出第一张图片第二行第三列第二个用到(B通道)的颜色强度
x[0][1][2][2]

<tf.Tensor: id=289, shape=(), dtype=float32, numpy=-2.9179385>

当张量的维度数较高时,使用[?][?]. . .[?]的方式书写不方便,可以采用[?,?, … , ?]的方式索引,它们是等价的。

x[1, 9, 2] == x[1][9][2]

<tf.Tensor: id=306, shape=(3,), dtype=bool, numpy=array([ True, True, True])>

2.切片

通过?????: ???: ????切片方式可以方便地提取一段数据,其中 start 为开始读取位置的索引,end 为结束读取位置的索引(不包含 end 位),step 为读取步长。

还是以shape为[4, 32, 32, 3]的图片张量为例。

# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 读取第二张和第三张图片
x[1:3]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,
     [-5.0662726e-01, 6.9743747e-01, -5.8803167e-02],
     [ 1.4200432e+00, -5.0182146e-01, 5.1661726e-02],
     [ 3.5610806e-02, -2.4781477e-01, 1.8222639e-01]],

    [[ 1.3892423e+00, 1.1985755e+00, -6.4732605e-01],
     [ 8.5562867e-01, 1.2758574e+00, 1.7331127e+00],
     [ 9.7743452e-02, -5.3990984e-01, 8.3400911e-01],
     ...,

 start: end: step切片方式有很多简写方式,其中 start、end、step 3 个参数可以根据需要选择性地省略,全部省略时即::,表示从最开始读取到最末尾,步长为 1,即不跳过任何元素。如 x[0,::]表示读取第 1 张图片的所有行,其中::表示在行维度上读取所有行,它等于x[0]的写法。

即x[0, ::]等价于x[0 ]。

为了更加简洁,::可以简写成为单个冒号。

x[:, 0:28:2, 0:28:2, :]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,

上述表示取所有图片,隔行采样,隔列采样,采集所有通道信息。相当于在图片的高宽各放缩至原来的一半。

下面是一些常见的切片方式小结:

TensorFlow索引与切片的实现方法

特别地,step可以为负数。例如:step = −1时,start: end: −1表示从 start 开始,逆序读取至 end 结束(不包含 end),索引号??? ≤ ?????。

x = tf.range(9)

# 逆序输出
x[8:0:-1]
<tf.Tensor: id=31, shape=(8,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1])>

# 逆序取全部元素
x[::-1]
<tf.Tensor: id=35, shape=(9,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1, 0])>

# 逆序间隔采样
x[::-2]
<tf.Tensor: id=39, shape=(5,), dtype=int32, numpy=array([8, 6, 4, 2, 0])>

当张量的维度数量较多时,不需要采样的维度一般用单冒号:表示采样所有元素。

x = tf.random.normal([4, 32, 32, 3])
# 提取所有图片的G通道
x[:,:,:,1]

<tf.Tensor: id=59, shape=(4, 32, 32), dtype=float32, numpy=
array([[[ 0.5700944 , 0.58056635, 2.2198782 , ..., -0.8475847 ,
     0.49761978, 0.28784937],
    [-0.22224228, 0.77950406, -0.01802959, ..., 0.55532527,
     0.6826188 , 0.50668514],
    [-2.4160695 , -0.96219736, 0.62681717, ..., 1.0348777 ,

为了避免出现像?[: , : , : ,1]这样出现过多冒号的情况,可以使用⋯符号表示取多个维度上所有的数据,其中维度的数量需根据规则自动推断:当切片方式出现⋯符号时,⋯符号左边的维度将自动对齐到最左边,⋯符号右边的维度将自动对齐到最右边,此时系统再自动推断⋯符号代表的维度数量。

TensorFlow索引与切片的实现方法

# 创建四张大小为32*32的彩色图片
x = tf.random.normal([4, 32, 32, 3])
# 读取第一张和第二张图片的G/B通道数据
x[0:2,...,1:]
# 读取最后两张图片
x[2,...]
# 读取所有图片的R/G通道
x[...,:2]

掌握了张量的索引与切片之后,会让我们的书写更加快捷。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python StringIO模块实现在内存缓冲区中读写数据
Apr 08 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
python多进程实现进程间通信实例
Nov 24 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
使用python+whoosh实现全文检索
Dec 09 Python
python绘制封闭多边形教程
Feb 18 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
python dict如何定义
Sep 02 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 #Python
python中必要的名词解释
Nov 20 #Python
python做接口测试的必要性
Nov 20 #Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 #Python
Python脚本操作Excel实现批量替换功能
Nov 20 #Python
详解Python中的format格式化函数的使用方法
Nov 20 #Python
Python数据分析pandas模块用法实例详解
Nov 20 #Python
You might like
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
2013/11/23 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
python实现SOM算法
2018/02/23 Python
python读取视频流提取视频帧的两种方法
2020/10/22 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
工作室成员个人发展规划范文
2014/01/24 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
小学生新年寄语
2014/04/03 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python
Python使用DFA算法过滤内容敏感词
2022/04/22 Python