3 索引和切片

2022-09-08 03:18:14 字數 4584 閱讀 7702

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_nd

2 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 ...