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中的XML库4Suite Server的介绍
Apr 14 Python
python 默认参数问题的陷阱
Feb 29 Python
python实现实时监控文件的方法
Aug 26 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
Python中一些不为人知的基础技巧总结
May 19 Python
Python中 map()函数的用法详解
Jul 10 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
python根据文本生成词云图代码实例
Nov 15 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
python录音并调用百度语音识别接口的示例
Dec 01 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
PHP面向对象法则
2012/02/23 PHP
php的hash算法介绍
2014/02/13 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
回顾Javascript React基础
2019/06/15 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
全球精选男装和家居用品:Article
2020/04/13 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
大学应届生的自我评价
2014/03/06 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
Docker下安装Oracle19c
2022/04/13 Servers