【NumPy學習指南】day4 多維數組的切片和索引

ndarray支持在多維數組上的切片操做。爲了方便起見,咱們能夠用一個省略號(...)來
表示遍歷剩下的維度。
(1) 舉例來講,咱們先用arange函數建立一個數組並改變其維度,使之變成一個三維數組:數組

b=np.arange(24).reshape(2,3,4)
b.shape
(2L, 3L, 4L)
b
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
多維數組b中有0~23的整數,共24個元素,是一個2×3×4的三維數組。咱們能夠形象地把它看作一個兩層樓建築,每層樓有12個房間,並排列成3行4列。或者,咱們也能夠將其當作是電子表格中工做表(sheet)、行和列的關係。你可能已經猜到,reshape函數的做用是改變數組的「形狀」,也就是改變數組的維度,其參數爲一個正整數元組,分別指定數組在每一個維度上的大小。若是指定的維度和數組的元素數目不相吻合,函數將拋出異常。
(2)咱們能夠用三維座標來選定任意一個房間,即樓層、行號和列號。例如,選定第1層樓、第1行、第1列的房間(也能夠說是第0層樓、第0行、第0列,這只是習慣問題),能夠這樣表示:
b[0,0,0]
0函數

(3) 若是咱們不關心樓層,也就是說要選取全部樓層的第1行、第1列的房間,那麼能夠將第1
個下標用英文標點的冒號:來代替:code

b[:,0,0]
array([ 0, 12])
b[0]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
咱們還能夠這樣寫,選取第1層樓的全部房間:
b[0,:,:]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
多個冒號能夠用一個省略號(...)來代替,所以上面的代碼等價於:
b[0,...]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
進而能夠選取第1層樓、第2排的全部房間:
b[0,1]
array([4, 5, 6, 7])遍歷

(4) 再進一步,咱們能夠在上面的數組切片中間隔地選定元素:方法

b[0,1,::2]
array([4, 6])異常

(5) 若是要選取全部樓層的位於第2列的房間,即不指定樓層和行號,用以下代碼便可:英文

b[...,1]
array([[ 1, 5, 9],
[13, 17, 21]])
相似地,咱們能夠選取全部位於第2行的房間,而不指定樓層和列號:
b[:,1]
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
若是要選取第1層樓的全部位於第2列的房間,在對應的兩個維度上指定便可:
b[0,:,1]
array([1, 5, 9])co

(6) 若是要選取第1層樓的最後一列的全部房間,使用以下代碼:block

b[0,:,-1]
array([ 3, 7, 11])
若是要反向選取第1層樓的最後一列的全部房間,使用以下代碼:
b[0,::-1,-1]
array([11, 7, 3])
在該數組切片中間隔地選定元素:
b[0,::2,-1]
array([ 3, 11])
若是在多維數組中執行翻轉一維數組的命令,將在最前面的維度上翻轉元素的順序,在咱們
的例子中將把第1層樓和第2層樓的房間交換:
b[::-1]
array([[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]],工作

[[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]]])

剛纔作了些什麼 咱們用各類方法對一個NumPy多維數組進行了切片操做。

相關文章
相關標籤/搜索