一:數組的屬性
每個數組都有它的屬性,可分為: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 ,有需要的時候再參考資料