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实现的百度贴吧网络爬虫实例
Apr 17 Python
python安装教程 Pycharm安装详细教程
May 02 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
详解重置Django migration的常见方式
Feb 15 Python
Python中类的创建和实例化操作示例
Feb 27 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
pymysql 开启调试模式的实现
Sep 24 Python
Python 支持向量机分类器的实现
Jan 15 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
Python 如何调试程序崩溃错误
Aug 03 Python
Python使用tkinter实现小时钟效果
Feb 22 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
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
jQuery的Ajax时无响应数据的解决方法
2010/05/25 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
js实现全选和全不选
2020/07/28 Javascript
简单的编程0基础下Python入门指引
2015/04/01 Python
使用python加密自己的密码
2015/08/04 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
英国豪华家具和家居用品购物网站:Teddy Beau
2020/10/12 全球购物
毕业自荐信
2013/12/16 职场文书
教师远程培训感言
2014/03/06 职场文书
三方股东合作协议书
2014/10/28 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python