1、基本索引
索引查詢方式單一
1 a = tf.ones([1,5,5,3])2print
(a[0][0])
3print
(a[0][0][0])
4print(a[0][0][0][2])
輸出:
tf.tensor([[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]], shape=(5, 3), dtype=float32)
tf.tensor([1. 1. 1.], shape=(3,), dtype=float32)
tf.tensor(1.0, shape=(), dtype=float32)
2、numpy型索引
將所有的索引寫在乙個列表中,而不是寫多個中括號,且可讀性也比較強
1 a = tf.random.normal([4,28,28,3])2print(a[1].shape) #
(28, 28, 3) 列印第1張的所有行,所有列,所有通道
3print(a[1,2].shape) #
(28, 3) 列印第1張**的第2行的所有列,所有通道
4print(a[1,2,3].shape) #
(3,) 列印第1張**的第2行的第2列的所有通道
5print(a[1,2,3,2].shape) #
() 列印第1張**的第2行的第2列的第2通道
3、start:end,指定開始和結束,不包含end
類似python中切片
1 a = tf.range(10)2print(a) #
tf.tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
3print(a[-1:]) #
tf.tensor([9], shape=(1,), dtype=int32)
4print(a[:2]) #
tf.tensor([0 1], shape=(2,), dtype=int32)
4、start:end:step
①乙個分號 :,相當於步長為1進行取樣,只能連續取
1#乙個分號
2 a = tf.random.normal([4,28,28,3])
3print(a.shape) #
(4, 28, 28, 3)
4print(a[0].shape) #
取第0張 (28, 28, 3)
5print(a[0,:,:,:].shape) #
取第0張的所有行所有列所有通道 (28, 28, 3)
6print(a[:,0,:,:].shape) #
取所有的第0行的所有列的所有通道 (4, 28, 3)
②兩個分號 ::可以實現跳著取(可以通過逗號,進行維數劃分)
1#兩個分號
2 a = tf.random.normal([4,28,28,3])
3print(a.shape) #
(4, 28, 28, 3)
4print(a[0:2,:,:,:]) #
第0,1張的所有行所有列所有通道
5print(a[:,0:28:2,0:28:2,:]) #
所有的第0,2,4....行,第0,2,4...列的所有通道
③逆序取樣,a[end : start : step]
1#逆序取樣
2 a = tf.range(10)
3print(a) #
tf.tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
4print(a[::-1]) #
從開頭到結尾逆序 tf.tensor([9 8 7 6 5 4 3 2 1 0], shape=(10,), dtype=int32)
5print(a[::-2]) #
tf.tensor([9 7 5 3 1], shape=(5,), dtype=int32)
6print(a[2::-2]) #
tf.tensor([2 0], shape=(2,), dtype=int32) 說明這種方式是從第end(即2)位開始到開頭
③省略號取樣,只要在邏輯上能推斷出省略號代表的冒號的數量,就是可行的
1#省略號取樣
2 a = tf.random.normal([2,4,28,28,3])
3print(a[0].shape) #
(4, 28, 28, 3)
4print(a[0,:,:,:,:].shape) #
(4, 28, 28, 3)
5print(a[0,...].shape) #
(4, 28, 28, 3)
6print(a[...,0].shape) #
(2, 4, 28, 28)
5、選擇性索引
前面的切片是基於start:end:step模式實現的,它在整體上來說,是基於步長的有規律性的一種取樣方式,而選擇性取樣具有隨意性,由程式設計師自己確定,如在tensor[4,28,28,3]上,要想取行維度上的樣,只需要給出確定的索引號即可,如[2,3,9,22,6,27,15]這些行
(1)tf.gather
假設有資料data:[classes,students,subjects] ,[4,35,8]即4個班級,每個班級35個人,每個人8門課成績
1#收集tf.gather
2 a = tf.random.normal([4,25,8])
3print(a.shape) #
(4, 25, 8)
45 b = tf.gather(a, axis=0, indices=[2,3]) #
收集第2,3個班級所有學生所有科目成績
6print(b.shape) #
(2, 25, 8)
(2)tf.gather_nd
假設不是希望取3名學生8門功課的成績(只有乙個維度),而是希望取第二個學生的第0門課的成績,第三個學生的第四們課的成績等
1 #收集tf.gather_nd2 a = tf.random.normal([4,35,8])
3print(a.shape) #
(4, 25, 8)
45 b = tf.gather_nd(a,[0]) #
第0個班級的所有學生的所有成績
6print(b.shape) #
(35, 8)
78 b = tf.gather_nd(a,[0,1]) #
第0個班級的第1個學生的所有成績
9print(b.shape) #
(8,)
1011 b = tf.gather_nd(a,[0,1,2]) #
第0個班級的第1個學生的第2門成績
12print(b.shape) #
()成績標量
1314 #多個查詢,將內層括號看作是乙個整體用來進行索引,然後外層括號組成相應的陣列
15 b = tf.gather_nd(a,[[0,0],[1,1],[2,2]]).shape #
第0個班級第0個學生的所有成績,第1個班級第1個學生的所有成績,第2個班級第個學生的所有成績,二維陣列
16print(b) #
(3, 8)
1718 b = tf.gather_nd(a,[[0,0,0],[1,1,1],[2,2,2]]).shape #
返回三個成績,組成長度為3的向量[成績a,成績b,成績c].shape為(3)
19print(b) #
(3,)
2021 b = tf.gather_nd(a,[[[0,0,0],[1,1,1],[2,2,2]]]).shape #
返回三個成績,[[成績a,成績b,成績c]],shape為(1,3)
22print(b) #
(1,3)
(3)tf.boolean_mask
1#tf.boolean_mask
2 a = tf.convert_to_tensor(np.ones([4,28,28,3]))
3print(a.shape)#(4, 28, 28, 3)45
#mask的個數要與相應的axis中維數相同
6 a = tf.boolean_mask(a, mask=[true,true,false,false]) #
axis預設是0,取第0維的屬性,即張數,取第0,1張
7print
(a.shape)#(2, 28, 28, 3)
89 a = tf.boolean_mask(a, mask=[true,true,false],axis=3) #
取第三維的通道,即第乙個和第二個通道是真ture,則取樣
10print(a.shape) #(2, 28, 28, 2)
numpy array索引和切片
一維陣列很簡單,基本和列表一致。它們的區別在於陣列切片是原始陣列檢視。這就意味著,如果做任何修改,原始都會跟著修改。這也意味著,如果不想更改原始陣列,我們需要進行顯式的複製,從而得到它的副本。copy import numpy as np arr np.arange 10 arr輸出 array 0...
numpy 索引和切片
一 取行 1 單行 陣列 index,取第index 1行 例子import numpy as np arr1 np.arange 0,24 reshape 4,6 取第2行資料 row1 arr1 1,print row1 2 連續的多行 陣列 start end 顧頭不顧尾,也可以使用步長,不過...
NumPy 切片和索引
import numpy asnp a np.arange 10,20,1 b slice 1,5,2 d a 1 5 2 e a 2 print a print a b print d print e 結果 1011 1213 1415 1617 1819 1113 1113 1213 1415 ...