Numpy數組基本操作(數組索引,數組切片以及數組的形狀,數組的拼接與分裂)


一:數組的屬性

   每個數組都有它的屬性,可分為:ndim(數組的維度),shape(數組每個維度的大小),size(數組的總大小),dtype(數組數據的類型)

 

二:數組索引

    和python列表一樣,Numpy的索引在一維數組中,也可以通過中括號重指定索引獲取第i個值(從0開始)

如:

     x1 = [1,2,3,4,5,6,7,8]

     print(x1[0])

out: 1

  比較有用的一個是,numpy支持負值索引,如print(x1[-1])

out:8

負值索引的時候是從-1開始的,-1表示倒數第一個數組位置對應的值

 

同樣多維數組中,可以用逗號分隔索引元組獲取元素,如:

    x2 = [[3,5,2,4]

     [7,6,8,8]

       [1,6,7,7]]

   x2 [0,0]

out:3

也可以用負值來索引,x2[-1,-1]

out:7

 

三:數組切片

 切片的意思就是獲取子數組,NumPy切片語法和Python列表的標准切片語法相同.為了獲取數組x的一個切片,可以用以下方式:

x[start:stop:step]

如果以上3個參數都未指定,那么默認就是[0:0:1]

因為跟python列表的語法基本相同,大概舉例一下,就不啰嗦了:

1.一維數組

x[:5]  #前五個元素

x[5:] #索引五之后的元素

x[4:7] #第4-7位置的元素

x[::2] #每隔一個位置取一個元素

 

 

2.多維數組

   多維數組采用同樣的方式,用逗號分隔.

x[:2,:3]  #兩行,三列

x[:3,::2]  #所有行,每個一列取一個元素  

x[::-1,::-1] #逆序數組

 

3.獲取數組的行和列

   常見的需求是獲取數組的單行和單列.可以將索引與切片組合起來實現這個功能,用一個冒號(:)表示空切片

x2[:,0]   #x2的第一列

x2[0,:]   #x2的第一行

   在獲取行時,出於語法簡潔,可以省略空的切片:

x2[0]   #等於 x2[0,:]  第一行

 

數組切片有一點非常重要,那就是數組切片返回的是數組數組的視圖,而不是數組的副本.python列表切片是值的副本.也就是說如果改變了NumPy數組切片的值后,原始的數組值也會跟着改變.

而如果改變python列表切片的值,原列表的值並不受影響.如下:

 

 可以看到x2_sub是x2的切片數組,當我們改變了x2_sub[0,0]的值后,x2對應位置的值也跟着發生變化了.

這種默認的處理方式實際上是非常有用的:它意味着在處理非常大的數據集時,可以獲取或處理這些數據的片段,而不用復制底層的數據緩存.

 

既然上面有提到numpy數組的切片子數組是視圖,改變切片的值會影響到原數組.那么當我們需要用到numpy數組的副本值的時候怎么處理?

這就要用到numpy的數組有copy()方法

如:

 

以上我們通過copy x2_sub_copy[:2,:2] 兩行兩列的子數組,並改變其子數組副本中的值,但結果並沒有影響x2數組

 

 

四:數組的形狀(shape)

  數組的形狀更多涉及的內容是數組的變形,也就是一維數組和多維數組,以及多維與多維數組之間的轉換問題;主要通過reshape函數來實現;

 

 gitd0 是一個一維數組,通過reshape函數轉成了3x3的二維數組gird1,可以看到通過reshape函數轉換后,gird0本身的形狀(值)並沒有改變.

因此我們大致可以理解為reshape函數轉換的結果其實是一個副本.

 

 

注意:用reshape函數來轉換數組的形狀,要使轉換成功有一個前提條件,那就是原始數組的大小必須和變形后的數組大小一致.

 

另外一個常見的變形模式是一維數組轉變為二維的行或列的矩陣,簡單地在一個切片操作中利用newaxis關鍵字:

 

 

 

五.數組的拼接與分裂

    數組的拼接和分裂是針對的多個數組的操作.

1.數組的拼接

   拼接或連接NumPy中的兩個數組主要由np.concatenate,np.vstack和np.hstack例程實現

其中 np.concatenate將數組元組或數組列表作為第一個參數

一維數組:

 

 二維數組拼接:

 

 concatenate拼接的時候,如果沒有特別指出 axis ,則默認沿着第一個軸拼接(垂直方向)

 

沿着固定維度處理數組時,使用np.vstack(垂直棧)和np.hstack(水平棧)函數會更直觀簡潔一些

 

 

進行數組拼接的時候,注意拼接的方向,數據位要對應上,如上面的垂直方向拼接的時候,所接的數組水平方向位數要跟被接數組的是一樣3位

 

2.數組的分裂

   數組的分裂和拼接是反方向的.分裂可以通過np.split,np.hsplit,vsplit函數來實現.

 

 split(x,[3,5])  其中的3和5是記錄的分裂點的位置,表示的是在數組的 x[3]位置開始設置分裂點,也可以看成是第3個數位后面設置分裂點,方便理解就行.

這種通過設置分裂點的方式,分裂得出的子數組數會比分裂點多1

vsplit,hsplit和split的用法類似,

 

 

同樣的vsplit(grid,[1])  其中[1]和split中的參數是一樣的,記錄的是分裂點的位置

 

另外還可以進行第三個維度的分裂,比較少用,可以用到函數 np.dsplit ,有需要的時候再參考資料

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM