Python中的索引與切片
一、索引
# 1.一維數(shù)組索引
str = 'HelloWorld!'
print(str[0])
print(str[-1])
# 輸出:
# H
# !
二、一維數(shù)據(jù)切片
? 一個完整的切片表達式包含兩個":",用于分隔三個參數(shù)(start_index、end_index、step),三個參數(shù)分別表示起始位置、結(jié)束位置、步長。
切片操作基本表達式:object[start_index:end_index:step]
? 三個參數(shù)均可省略,省略后取該參數(shù)的默認值:
? ①step的默認值為1。
? ②start_index的默認值與step的正負有關(guān),若step為正,表正序。此時start_index默認為0,若為負,表逆序,start_index的默認值為-1。
? ③end_index的默認值與step的正負有關(guān),若step為正,表正序。此時end_index默認為數(shù)組結(jié)束位置。若為負,表逆序,end_index為數(shù)組起始位置?!咀ⅰ?strong>end_index的索引值是不被包括的,具體可見以下列子。
? 以下示例均以list對象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]為例:
1.切取單個元素
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0]) #輸出0
print(a[-1]) #輸出9
2.切取完整對象
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1.正序切取對象
print(a[0:10:1]) # 輸出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 2.逆序切取對象
print(a[10:0:-1]) # 輸出:[9, 8, 7, 6, 5, 4, 3, 2, 1]
3.切取部分對象
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1.正序切取部分對象
print(a[1:6:1]) #輸出[1, 2, 3, 4, 5]
# 2.逆序切取部分對象
print(a[6:1:-1]) #輸出[6, 5, 4, 3, 2]
4.控制步長
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1.正序,步長為2
print(a[0:10:2]) #輸出:[0, 2, 4, 6, 8]
# 2.逆序,步長為1
print(a[6:0:-1]) #輸出:[6, 5, 4, 3, 2, 1]
5.參數(shù)省略
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1.正序,切取完整對象
print(a[:]) #輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[::]) #輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 2. 切取部分對象,步長2
print(a[::2]) #輸出:[0, 2, 4, 6, 8]
print(a[::-3]) #輸出:[9, 6, 3, 0]
# 3.其他情況
print(a[4:]) #輸出:[4, 5, 6, 7, 8, 9],step正,正序;start從4開始,直到末尾元素9
print(a[4::-1]) #輸出:[4, 3, 2, 1, 0],step負,逆序;start從4開始,直到末尾,末尾是0元素,
print(a[:-4:-1]) #輸出:[9, 8, 7],step負,逆序;從start_end=-1開始,直到end_index = -4(該點不包括)
print(a[2:-1]) #輸出:[2, 3, 4, 5, 6, 7, 8],step正,正序;start從2開始,到end_index=-1(該點不包含)
6.多層切片
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[::2][::-1][0:4])
# 輸出: [8, 6, 4, 2]
# a[::2]: 輸出[0, 2, 4, 6, 8];
# a[::2][::-1]: 輸出[8, 6, 4, 2, 0],[::-1]表示在上述的基礎(chǔ)上逆序
# a[::2][::-1][0:4]: 輸出[8, 6, 4, 2],表示取從序號0開始,到序號4(不包括)
7.總結(jié)
- 當(dāng)start_index或end_index省略時,取值的起始索引和終止索引由step的正負來決定。
- step的正負是必須要考慮的,尤其是當(dāng)step省略時。比如a[-1:],很容易就誤認為是從“終點”開始一直取到“起點”,即a[-1:]= [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],但實際上a[-1:]=[9](注意是[9]不是9),原因在于step省略時step=1表示從左往右取值,而起始索引start_index=-1本身就是對象的最右邊元素了,再往右已經(jīng)沒數(shù)據(jù)了,因此結(jié)果只含有9一個元素。
- 取單個元素(不帶":"號)時,返回的是對象的某個元素,若表達式帶":"號,返回的對象是一個列表,哪怕列表中只包含一個元素。
三、二維及更高維數(shù)據(jù)切片
? 二維及更高維度的數(shù)據(jù)切片與一維的數(shù)據(jù)切片其實非常類似,只要掌握了一維的數(shù)據(jù)切片,高維的就能很容易地理解?!咀ⅰ慷S及以上切片要配合numpy使用。
? 與一維數(shù)據(jù)切片類似,每個維度的完整切片表達式包含兩個":",用于分隔三個參數(shù)(start_index、end_index、step),三個參數(shù)分別表示起始位置、結(jié)束位置、步長。并用","號區(qū)分不同維度的切片表達式。
二維切片操作基本表達式:object[start_index:end_index:step,start_index:end_index:step]
? 以下示例均以list對象a = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]為例:
1.獲取單個元素
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print('a[0][1]:', a[0][1]) #輸出:a[0][1]: 2
2.獲取行列等
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print('a[0][1]:', a[0][1]) #輸出:a[0][1]: 2
# 1.取完整的對象,","前面表示第一維度,后面標(biāo)示第二維度。
print('取完整對象:\n', a[::, ::])
# 1.1:號也可以省略
print('取完整對象,省略1:\n', a[:, ])
print('取完整對象,省略2:\n', a[:])
# 輸出:
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
# 2.第一個維度,取從0(省略)到2(不包含),步長為1,即取數(shù)組的1,2行;第二維表達式省略
print('取0-1行:\n', a[:2, ])
# 輸出:
# [[1 2 3 4]
# [5 6 7 8]]
# 3.第一維度,取數(shù)組的2,3行,步長為1;第二維度,取3-4列,步長為1
print('2-3行的2-3列:\n', a[1:3, 2:4])
# 輸出:
# [[7 8]
# [11 12]]
# 4.取第1,3列的元素,第二維度的start_index與end_index省略,step為2
print('取第1,3列的元素\n', a[:, ::2])
# 輸出:
# [[1 3]
# [5 7]
# [9 11]]
# 5.取第一列,賦值到y(tǒng),取除去第一列外的所有列,賦值到X
# y:第一維度表達式省略,start_index省略
# X:第一維度表達式省略,end_index省略
y = a[:, :1]
X = a[:, 1:]
print('y:\n', y)
print('X:\n', X)
3.三維的情況
import numpy as np
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
# 取第一維度0-1,第二維度1-2,第三維度0-1
print(a[0:1,1:2,0:1])