索引与切片
索引方式:
第一种:最基本的索引方式,第二种:用:去进行索引,第三种:用...去进行索引。(不知道是否正确)
首先来说下第一种:
a = tf.ones([1,5,5,3])
print(a[0])
print(a[0][0])
print(a[0][0][0]) #最基本的索引方式,给出各层的数值
给出各层的数值。
第二种:
b = tf.random.normal([4,28,28,3])
print(b[1].shape)
print(b[1,2].shape) # =b[1][2]
c=tf.range(10)#靠近初始段用正的编号,末端用负的编号
print(c[-1:])# c[a:b] 从a取到b(不包含b),不写b的话代表从a到末端,不写a的话代表从初始段到b
#不写=默认
#取一段数据
#a[0].shape = a[0,:,:,:]
print(a[:,:,:,0].shape) #取中间的维度
print(a[:,0,:,:].shape)
#增加一个 : 隔着取
#a[::3]隔着三个取一个数据
print(a[:,0::4,:,:]) #每隔着四个点取一次
print(a[::-1]) #倒叙
print(a[::-2]) #隔着采取
在第一种的基础上进行了简化操作,并且实现隔着固定的数据去取数据。
注:c[a:b] 从a取到b(不包含b),不写b的话代表从a到末端,不写a的话代表从初始段到b
第三种:在第二种的基础上进行简化操作:
# ... #自动推导
#代替连续的冒号
print(a[...,0]) #0代表最末的维度
print(a[:,:,:,0])
切片方式:
#Selective indexing
利用gather进行切片处理。
#Selective indexing
#gather 收集
#指定行数
d = tf.random.normal([4,35,8])
print(tf.gather(a,axis=0,indices=[2,3]))
#axis 代表哪个维度 indices代表哪个索引
#可以联合起来使用
(axis=)代表的是维度,indices= 代表的是索引
print(tf.gather_nd(d,[0]).shape)
#当作d[0]
print(tf.gather_nd(d,[[[0,0,0],[1,1,1],[2,2,2]]]))
print(tf.gather_nd(d,[[0,0,0],[1,1,1],[2,2,2]]))
加一个中括号和加两个中括号的shape会发生变化。
利用boolean_mask进行切片处理。
a=tf.random.normal([4,28,28,3])
print(tf.boolean_mask(a,mask=[True,True,False,False]).shape)
print(tf.boolean_mask(a,mask=[True,True,False],axis=3).shape)
#未指定axis则默认为0
注意的是未指定axis默认的为0。
a = tf.ones([2,3,4])
print(tf.boolean_mask(a,mask=[[True,False,False],[False,True,True]]))
根据中括号中的中括号对对应的维度进行切片。