【NumPy學習指南】day5 改變數組的維度

咱們已經學習了怎樣使用reshape函數,如今來學習一下怎樣將數組展平。數組

(1) ravel 咱們能夠用ravel函數完成展平的操做:
In: b
Out:
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]]])
In: b.ravel()
Out:
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])函數

(2) flatten 這個函數恰如其名,flatten就是展平的意思,與ravel函數的功能相同。
不過,flatten函數會請求分配內存來保存結果,而ravel函數只是返回數組的一個視圖(view):
In: b.flatten()
Out:
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])學習

(3) 用元組設置維度 除了能夠使用reshape函數,咱們也能夠直接用一個正整數元組來設
置數組的維度,以下所示:
In: b.shape = (6,4)
In: b
Out:
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成了一個6×4的多維數組。對象

(4) transpose 在線性代數中,轉置矩陣是很常見的操做。對於多維數組,咱們也能夠這樣作:
In: b.transpose()
Out:
array([[ 0, 4, 8, 12, 16, 20],
[ 1, 5, 9, 13, 17, 21],
[ 2, 6,10, 14, 18, 22],
[ 3, 7,11, 15, 19, 23]])內存

(5) resize resize和reshape函數的功能同樣,但resize會直接修改所操做的數組:
In: b.resize((2,12))
In: b
Out:
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]])
剛纔作了些什麼
咱們用ravel、flatten、reshape和resize函數對NumPy數組的維度進行了修改。
動手實踐:組合數組
首先,咱們來建立一些數組:
In: a = arange(9).reshape(3,3)
In: a
Out:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In: b = 2 * a
In: b
Out:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14,16]])請求

(1) 水平組合 咱們先從水平組合開始練習。將ndarray對象構成的元組做爲參數,傳給
hstack函數。以下所示:
In: hstack((a, b))
Out:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8,10],
[ 6, 7, 8,12,14,16]])
咱們也能夠用concatenate函數來實現一樣的效果,以下所示:
In: concatenate((a, b), axis=1)
Out:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8,10],
[ 6, 7, 8,12,14,16]])數據

(2) 垂直組合 垂直組合一樣須要構造一個元組做爲參數,只不過此次的函數變成了
vstack。以下所示:
In: vstack((a, b))
Out:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8,10],
[12,14,16]])
一樣,咱們將concatenate函數的axis參數設置爲0便可實現一樣的效果。這也是axis參
數的默認值:
In: concatenatel((a, b), axis = 0)
Out:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8,10],
[12,14,16]])二維數組

(3) 深度組合 將相同的元組做爲參數傳給dstack函數,便可完成數組的深度組合。所謂
深度組合,就是將一系列數組沿着縱軸(深度)方向進行層疊組合。舉個例子,有若干張二維平
面內的圖像點陣數據,咱們能夠將這些圖像數據沿縱軸方向層疊在一塊兒,這就形象地解釋了什麼
是深度組合。
In: dstack((a, b))
Out:
array([[[0, 0],
[1, 2],
[2, 4]],
[[3, 6],
[4, 8],
[5,10]],
[[6,12],
[7,14],
[8,16]]])view

(4) 列組合 column_stack函數對於一維數組將按列方向進行組合,以下所示:
In: oned = arange(2)
In: oned
Out: array([0, 1])
In: twice_oned = 2 * oned
In: twice_oned
Out: array([0, 2])
In: column_stack((oned, twice_oned))
Out:
array([[0, 0],
[1, 2]])
而對於二維數組,column_stack與hstack的效果是相同的:
In: column_stack((a, b))
Out:
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8,10],
[ 6, 7, 8,12,14,16]])
In: column_stack((a, b)) == hstack((a, b))
Out:
array([[ True, True, True, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True]], dtype=bool)
是的,你猜對了!咱們能夠用==運算符來比較兩個NumPy數組,是否是很簡潔?vi

(5) 行組合 固然,NumPy中也有按行方向進行組合的函數,它就是row_stack。對於兩 個一維數組,將直接層疊起來組合成一個二維數組。 In: row_stack((oned, twice_oned)) Out: array([[0, 1], [0, 2]]) 對於二維數組,row_stack與vstack的效果是相同的: In: row_stack((a, b)) Out: array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 0, 2, 4], [ 6, 8,10], [12,14,16]]) In: row_stack((a,b)) == vstack((a, b)) Out: array([[ True, True, True], [ True, True, True], [ True, True, True], [ True, True, True], [ True, True, True], [ True, True, True]], dtype=bool) 剛纔作了些什麼 咱們按照水平、垂直和深度等方式進行了組合數組的操做。咱們使用了vstack、dstack、 hstack、column_stack、row_stack以及concatenate函數。

相關文章
相關標籤/搜索