各位同学好,今天我和大家分享一下TensorFlow2.0中索引与切片。内容有:

(1) 给定每一维度的索引来获取数据;(2) 切片索引;(3) 省略号应用;(4) tf.gather() 方法;(5) tf.gather_nd() 方法;(6) 布尔索引选数据

那我们开始吧。


1. 给定每一维度的索引获取数据

1.1 变量[ ][ ] 方法

首先定义一个全为1的四维tensor,如:tf.ones([2,3,3,2])。由于整个数据庞大,不利于观察,我们使用.shape来观察取出数据的情况。

#创建一个全为1的四维tensor,默认float32
a = tf.ones([2,3,3,2])
# 返回3,3,2的tensor
a[0].shape
#取出3行2列的矩阵tensor
a[0][0].shape
#返回长度为2列表tensor
a[0][0][0].shape
#值为标量1,是0维tensor.
a[0][0][0][1].shape  

我们可以把这个四维tensor,[2,3,3,2],理解为,有2个班级,每个班级有3名同学,每名同学有3门科目,每门科目有2份作业。

a[0] 可以理解为,第0个班级的所有数据,它包含3名同学,每名有3门科目,每科目有2份作业。因此,a[0] 是一个三维tensor形状为[3,3,2]

a[0][0] 可以理解为,第0个班级的第0个同学的所有数据,它包含3门科目,每科目有2份作业。因此,a[0][0] 是一个二维tensor形状为[3,2]

同理其他两个


1.2 变量[ , ] 方法

我们创建一个四维随即正态分布的tensor,形状shape为[4,5,6,7],我们同样可以用上一个理解方法来看这个四维tensor。4个班级,每班5个人,每人6门课,每门课7份作业。

#创建一个四维随机正态分布tensor
a = tf.random.normal([4,5,6,7])
#
a[1].shape  # 返回[5,6,7]
#
a[1,2].shape  # 返回[6,7]
#
a[1,2,3].shape  # 返回[7]
#
a[1,2,3,4]  # 返回值

a[1,2] 代表第1个班级中,第2名学生的所有信息,包含6门功课,每门课7份作业。因此,a[1,2].shape是一个二维tensor,形状为[6,7]该方法a[1,2]等同于上述的a[1][2]。可以少写括号且更直观。

a[1,2,3,4] 代表第1个班级中的第2名学生的第3门功课的第4份作业的信息,返回一个值。


2. 切片索引

2.1 变量[start : end]

使用位置索引切片,顾头不顾尾

# ==1== 方法一#从0-9的10个元素组成的tensor
a = tf.range(10)
# 获取3、4、5
a[3:6]
# 获取前3个,0、1、2
a[:3]
# 获取倒数第4个到倒数第2个,-1代表最后一个
a[-4:-1]


2.2 多个冒号,变量[A , : , : , B]

首先创建一个四维的tensor,shape为[4,5,6,7]。可以理解为,有4幅图像,每幅图像有5行,每一行包含6列,每一列有7个数据。

# ==2== 方法二
#创建4维tensor
b = tf.ones([4,5,6,7])
# 第0张图像有5行,每行有6列,每列有7个数
b[0].shape
# 取第0张图片的所有数据
b[0,:,:,:].shape
# 变成单通道,前3个维度全部获取,第四个维度取第2个
b[:,:,:,2].shape
# 4张图像都取第2行,每行的所有列,每列的所有值,shape[4,6,7]
b[:,2,:,:].shape

b[0] 和 b[0,:,:,:] 代表相同意思,都是取第0张图像的全部数据,返回的shape都是[5,6,7],即第0张图像有5行,每行有6列,每列有7个数值。

b[:,2,:,:] 代表所有图像的第2行数据,包含4张图像,每张图像有6列,每列有7个数值。因此,shape为[4,6,7]


2.3 指定步长,隔行采样,变量[start : end : step]

正序,定义的四维tensor,shape为[5,6,7,8],可以按上述方法理解它。

# 定义四维且值全为1的tensor
c = tf.ones([5,6,7,8])
# 第1、3张图像的所有数据
c[1:5:2,:,:,:].shape
# 5张图片图片的第1、3行,0、2列的所有数据
c[:,1:5:2,:4:2,:].shape

c[ 1:5:2 , : , : , : ] 代表第1、3张图像的全部信息,因为1到5张图像,步长为2,顾头不顾尾。因此shape为 [2,6,7,8]

c[:,1:5:2,:4:2,:] 代表所有5张图像,取1、3行信息,和取0、2列信息中的所有数据。因此shape为 [5,2,2,8]

步长为负数时,要求A靠近原数据尾端,B是前端

逆序排序方法: 变量 [A : B : -1]

# ==4== 逆序排序
#创建0-4的tensor
d = tf.range(5)
# 给d逆序排序
d[::-1]
# 倒序:4、2、0
d[4::-2] 


3. 省略号 '...' 方法

相比于 变量[ A , : , : , : , B]变量 [ A , ... , B ] 中,省略号自动计算A和B之间有几个':',写起来更方便。

首先创建一个五维tensor,形状shape为[3,10,12,14,8],其中 a[0]a[0 , : , : , : , : ]a[0 , ...] 代表的意思相同,都是指第一张图像的全部数据。shape为[10,12,14,8]

a[0 , ... , 4 , :] 中的省略号代表第3、4维度的全部数据,shape为[10,12,8]

# 创建一个五维tensor
a = tf.random.normal([3,10,12,14,8])
# 第0张图像的所有数据
a[0].shape
a[0,:,:,:,:].shape  # 和上式相同
a[0,...].shape  # 省略号代表后面的冒号
# 省略号代表中间两维
a[0,...,4,:].shape  


4. tf.gather()函数

指定某一个维度,按照指定索引获取数据

tf.gather(tensor, axis, indices=[ ])

value:代表tensor数据

axis: 代表取哪个维度

indices: 数据收集顺序,指定维度的具体索引

4.1 使用一次 tf.gather()

创建一个三维的data全由0构成,shape为[4,35,8],可以理解为4个班级,每个班级35个人,每个人有8门功课。指定一个维度,获得该维度下其他维度的部分数据

# 假设data三维[班级,学生,科目]
data = tf.zeros([4,35,8])
# indices指定收集顺序,查第2、3个班级的所有数据
tf.gather(data,axis=0,indices=[2,3]).shape
# 指定维度1即学生,收集索引号维30、5、18、2这四个学生的数据
tf.gather(data,axis=1,indices=[30,5,18,2]).shape

axis用来指定维度,axis=0代表班级维度,axis=1代表学生,axis=2代表功课

先指定维度0代表班级维度,获取第2、3个班级的全部数据,返回shape为[2,35,8]。班级维度变成了2个,而而每个班级仍包含35名学生,每名学生,仍有8门课。

若指定维度1代表学生维度,挑选第30、5、18、2这四名同学。这4个班都挑选需要为这四个数的四名学生,获取他们的全部数据,因此,班级维度没有改变,还是4,学生维度指定了只有4个,功课维度没变,仍有8个,最后shape为[4,4,8]


4.2 连续使用几次 tf.gather()

上面是获取指定维度指定索引的全部数据。如果我想获取指定维度指定索引的指定数据怎么办呢。

我们连续使用两次tf.gather()来抽查,所有班级某几位同学的某几门课的成绩

# 获得四个班级指定三名学生的指定的三门课信息
data = tf.zeros([4,35,8])
a1 = tf.gather(data,axis=1,indices=[30,5,18,2])  #获取4名学生的全部信息
a2 = tf.gather(a1,axis=2,indices=[6,1,4]).shape  #axis=2指定科目,获取6,1,4科目信息

获得四个班级,每个班的30、5、18、2这个四名同学的6、1、4这3门功课的信息,因此结果shape为[4,4,3]


5. tf.gather_nd() 函数

tf.gather_nd(tensor, indices)

按照 indices 的格式从传入的tensor中抽取切片(合并为一个Tensor)indices是一个K维整数Tensor

首先创建一个三维且值全为0的tensor,可按上述方法理解这三维。

# 指定2个维度,取第三个维度的所有值
data = tf.zeros([4,35,8])
# 获取第[[0]]个班级所有数据,返回值减少一维度
a1 = tf.gather_nd(data,[0]).shape
# 取0号班级第1个学生的数据,返回值少两个维度
a2 = tf.gather_nd(data,[0,1]).shape
# 取0号班级第1个学生的第2门课的数据,返回值少三个维度
a3 = tf.gather_nd(data,[0,1,2]).shape

tf.gather_nd(data,[0,1,2]) 代表从data中获取第0个班级的第1个学生的第2门课的数据,是一个值,因此返回的shape为 []

注意参数indices的括号使用方法,如a5,首先获取第0个班级的第1个学生的功课数据(一维),第1个班级第5个学生的功课数据(一维),2个列表组合放到一个列表里,组成二维列表,再在外面加一个中括号,生成三维,理解为这是第1次抽取结果,因此返回的shape为[1,2,8]

再如a6,获取的是指定班级指定学生的功课信息,[0,4]指第0个班级第4位同学的所有功课数据,返回一个列表(一维),由8门功课组成。三个一维列表外面加一个中括号,构成二维列表。shape维[3,8]。指有3位同学,每位同学有8门课。

# 取第0个班级的第1名学生的第2门课成绩,和第1个班级的第5名学生的第7门课成绩,放在一个列表中
a4 = tf.gather_nd(data,[[0,1,2],[1,5,7]]).shape
# 取第0个班级的第1名学生的所有课成绩,和第1个班级的第5名学生的所有课成绩
a5 = tf.gather_nd(data,[[[0,1],[1,5]]]).shape
# 将二维的成绩信息放在一个三维tensor中,
# 第一维表示第一次记录,第二维表示哪些学生,第三维表示每个学生的所有科目
a6 = tf.gather_nd(data,[[0,4],[1,7],[3,5]]).shape
# 第0个班级的第4个学生的所有科目,第1个班级第7个学生所有科目。。。组合成一个二维tensor


6. 布尔索引选数据

tf.boolean_mask(tensor, mask=布尔标记, axis=指定维度)

mask的shape要和指定维度的tensor的shape相同。输出mask标记维True的值。

# 选择输出mask为True的值
a = tf.ones([3,35,5,10]) # 3个班级35名学生5门课各有10份作业
# 对第0维的3个班级生成mask,即值要第0、1个班级的数据
tf.boolean_mask(a,mask=[True,True,False]).shape  #默认axis=0,即第一个维度
# 对第2维的课目生成mark,要第2、3门课的所有信息
tf.boolean_mask(a,mask=[False,False,True,True,False],axis=2).shape

tf.boolean_mask(a,mask=[True,True,False]).shape 对班级维度的三个班级进行选择,第0、1个班级为True,第2个班级为False,因此输出第0、1个班级的全部信息,即shape为[2,35,5,10]

生成一个三维的值全为1的tensor,没有指定axis,可看出是对班级维度和学生维度的筛选。输出结果的第一行是第0个班级第0个学生的4项信息,结果的第二三行是第1个班级第1、2个学生的四项信息。

b = tf.ones([2,3,4])
# mask对应b的前两维度,第0维度取第0列的所有数据,第维度取第1、2列的所有数据
tf.boolean_mask(b,mask=[[True,False,False],[False,True,True]])

【TensorFlow2.0】(3) 索引与切片操作相关推荐

  1. Pandas知识点-索引和切片操作

    Pandas知识点-索引和切片操作 索引和切片操作是最基本最常用的数据处理操作,Pandas中的索引和切片操作基于Python的语言特性,支持类似于numpy中的操作,也可以使用行标签.列标签以及行标 ...

  2. dataframe两个表合并_Part25:Pandas基础(Series,DataFrame类的创建、索引、切片、算术方法)...

    一.为什么学习pandas numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类 ...

  3. TensorFlow2.0:索引和切片(1)

    ** 一 基本的索引方式 ** 给定每个维度的索引,直接进行索引 In [1]: import tensorflow as tf In [2]: import numpy as np In [3]: ...

  4. c++list支持索引吗_还在为不懂Python切片操作及原理而苦恼吗?漫画帮你立马理解掌握...

    我首先通过 input() 函数,接收了外部输入字符串,然后通过 list 函数的切片,实现了回文数,代码真的好简洁,我自己都佩服我自己,我也不知道小组长会问我切片原理,我好无奈呀. s = inpu ...

  5. 深度学习(7)TensorFlow基础操作三: 索引与切片

    深度学习(7)TensorFlow基础操作三: 索引与切片 一. 基础索引 1. Basic indexing 2. Numpy-style indexing 3. start : end 4. 切片 ...

  6. python入门_老男孩_数据类型简介_int/bool/str转换_字符串索引和切片_字符串操作_day3...

    关键词 数据类型 int, bool, str之间的相互转换 字符串的索引与切片 字符串的操作 数据类型 int 1 2 3 用于计算 bool True False 用户判断 str 'haojil ...

  7. 【深度学习】利用tensorflow2.0卷积神经网络进行卫星图片分类实例操作详解

    本文的应用场景是对于卫星图片数据的分类,图片总共1400张,分为airplane和lake两类,也就是一个二分类的问题,所有的图片已经分别放置在2_class文件夹下的两个子文件夹中.下面将从这个实例 ...

  8. mybatis-plus对datetime返回去掉.0_华为AI认证-TensorFlow2.0编程基础

    参考<HCIA-AI2.0培训教材><HCIA-AI2.0实验手册> 认证要求: 了解TensorFlow2.0是什么以及其特点 掌握TensorFlow2.0基础和高阶操作方 ...

  9. TensorFlow2.0学习

    文章目录 一.TensorFlow的建模流程 1.1 结构化数据建模流程范例 1.1.1 准备数据 1.1.2 定义模型 1.1.3 训练模型 1.1.4 评估模型 1.1.5 使用模型 1.1.6 ...

最新文章

  1. 最新剑桥《AI全景报告》出炉:中国发表机器学习学术研究超过美国
  2. java 停顿 分钟_java - 年轻的垃圾收集更长时间停顿与Java 7 vs java 6 - 堆栈内存溢出...
  3. qt 进程打开excel_Qt QAxObject操作excel文件过程总结(转):(示例代码)
  4. 我的团队[六]———功夫在诗外
  5. 在Xcode8中 如何添加.pch文件
  6. es6 --- 正确获取Generator函数内部的this对象使其可以使用new
  7. Oracle EXP/IMP参数详解
  8. 计算机师范专业考编,不是师范生考教师很难?这4个专业考教师反而轻松!
  9. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解
  10. 笔记16(shell编程)
  11. Rust : cargo简介
  12. 使用mustache js模板引擎
  13. 监控易:智慧高校一体化综合运维解决方案
  14. 2022年 超详细的Android(安卓)入门编程教程
  15. 仿QQ登录界面UI设计
  16. Python正则匹配 去除文本中的各类emoji表情符号
  17. 基础算法练习:杨辉三角形
  18. windows系统中nginx图片服务器,windows nginx 图片服务器
  19. kafka:默认的分区策略
  20. C语言求两个正整数的最小公倍数

热门文章

  1. The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task
  2. Ubuntu系统查看文件夹目录
  3. Android Environment 的作用以及常用的方法
  4. JSONObject没有fromObject方法(Json lib 库的使用)
  5. 关于acm的新手一些问题
  6. Mysql for Mac 安装及环境配置
  7. oracle10g索引不生效,oracle 10g分区表索引失效测试
  8. Go 学习笔记(41)— Go 标准库之 encoding/base64 (编解码)
  9. layoutSubviews总结(转)
  10. PHP Multipart/form-data remote dos Vulnerability