【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]]])
(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數組,是不是很簡潔?
(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函數。


免責聲明!

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



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