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下利用OpenCV来旋转图像的教程
Apr 16 Python
python计算两个地址之间的距离方法
Jun 09 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
python实现批量注册网站用户的示例
Feb 22 Python
Python使用贪婪算法解决问题
Oct 22 Python
python3 动态模块导入与全局变量使用实例
Dec 22 Python
通过实例学习Python Excel操作
Jan 06 Python
Python3 assert断言实现原理解析
Mar 02 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
Python 实现将某一列设置为str类型
Jul 14 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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
php实现图片添加水印功能
2014/02/13 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
基于jquery 的一个progressbar widge
2010/10/29 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
Python实现基于POS算法的区块链
2018/08/07 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
元旦晚会感言
2014/03/12 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书