NumPy 1.14 教學 – #05 形狀操作、矩陣互相堆疊(Stacking)、矩陣切割(Splitting)
開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記NumPy也提供了許多改變矩陣形狀、堆疊(Stacking)和切割(Splitting)的方法,這些功能也頗為實用!
本文將介紹以下方法:reshape, ravel, vstack, hstack, vsplit, hsplit本文章範例也同步存放在:Learn NumPy – GitHub
形狀操作(Shape Manipulation)
矩陣的形狀(shape)很重要!尤其是再進行科學運算時,最常用到矩陣運算!
不過,強大的NumPy中提供了很多改變矩陣形狀的功能,可以滿足開發者的需求!
np.reshape(a, b):這是最基本的塑形功能,可以直接將陣列重新塑形成a-by-b或是更高維度的形狀!
1 2 3 |
a = np.arange(1, 51).reshape(5, 10) print("a =>\n",format(a)) print("a.shape:",format(a.shape)) |
1 2 3 4 5 6 7 |
a => [[ 1 2 3 4 5 6 7 8 9 10] [11 12 13 14 15 16 17 18 19 20] [21 22 23 24 25 26 27 28 29 30] [31 32 33 34 35 36 37 38 39 40] [41 42 43 44 45 46 47 48 49 50]] a.shape: (5, 10) |
np.reshape(a, b, -1):使用-1,代表這個維度就交給NumPy自動計算!
1 2 3 4 5 6 |
a = np.arange(1, 51).reshape(5, 10) print("a.reshape(5, 2, 5)=>\n{0}".format(a.reshape(5, 2, 5))) print() #效果會跟.reshape(5, 2, 5)是一樣的,因為NumPy算得出來! print("a.reshape(5, 2, -1)=>\n{0}".format(a.reshape(5, 2, -1))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
a.reshape(5, 2, 5)=> [[[ 1 2 3 4 5] [ 6 7 8 9 10]] [[11 12 13 14 15] [16 17 18 19 20]] [[21 22 23 24 25] [26 27 28 29 30]] [[31 32 33 34 35] [36 37 38 39 40]] [[41 42 43 44 45] [46 47 48 49 50]]] a.reshape(5, 2, -1)=> [[[ 1 2 3 4 5] [ 6 7 8 9 10]] [[11 12 13 14 15] [16 17 18 19 20]] [[21 22 23 24 25] [26 27 28 29 30]] [[31 32 33 34 35] [36 37 38 39 40]] [[41 42 43 44 45] [46 47 48 49 50]]] |
np.ravel():此功能會回傳一個將陣列或矩陣經扁平化(flattened)處理後的陣列
1 2 |
a = np.arange(1, 51).reshape(5, 10) print("a.ravel()=> {0}".format(a.ravel())) |
1 2 3 |
a.ravel()=> [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50] |
$b=\begin{bmatrix}1 & 2 & 3\\
4 & 5 & 6
\end{bmatrix}^T=\begin{bmatrix}1 & 4\\
2 & 5\\
3 & 6
\end{bmatrix}$
ndarray.T:轉置矩陣(transpose) 注意喔!這是屬性!
1 2 3 4 5 |
b = np.arange(1, 7).reshape(2, 3) print("b =>\n{0}".format(b)) print() print("轉置矩陣b(Transpose b.)\n=>\n{0}".format(b.T)) |
1 2 3 4 5 6 7 8 9 |
b => [[1 2 3] [4 5 6]] 轉置矩陣b(Transpose b.) => [[1 4] [2 5] [3 6]] |
矩陣堆疊(Stacking)
這還蠻常用到的…這功能可以方便運算時矩陣串接的需求!
np.vstack(a, b):將a, b矩陣沿著垂直軸堆疊!
np.hstack(a, b):將a, b矩陣沿著水平軸堆疊!
1 2 3 4 5 6 7 8 9 10 |
a = np.arange(1,11).reshape(2,5) print("a=>\n{0}".format(a)) print() # 水平堆疊 print("np.vstack((a,a))=>\n{0}".format(np.hstack((a,a)))) print() # 垂直堆疊 print("np.hstack((a,a))=>\n{0}".format(np.vstack((a,a)))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
a=> [[ 1 2 3 4 5] [ 6 7 8 9 10]] np.hstack((a,a))=> [[ 1 2 3 4 5 1 2 3 4 5] [ 6 7 8 9 10 6 7 8 9 10]] np.vstack((a,a))=> [[ 1 2 3 4 5] [ 6 7 8 9 10] [ 1 2 3 4 5] [ 6 7 8 9 10]] |
矩陣分割(Splitting)
將一個陣列或矩陣分割成多個小的矩陣或陣列!
np.hsplit( matrix, shape/number ):將matrix沿著自己的水平軸分割成指定的形狀(shape)或數量(number)
np.vsplit( matrix, shape/number ):將matrix沿著自己的垂直軸分割成指定的形狀(shape)或數量(number)
這個函數回傳型別是list!如果還想要利用NumPy的對它操作的話,要把它轉換成numpy.ndarray才行!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
a = np.round(np.arange(1, 13).reshape(2, 6)*10, 0) print("a=>\n{0}".format(a)) print() print("----hsplit----") output1 = np.hsplit(a, 3) i = 0 for smallMatrix in output1: print("np.hsplit(a, 3) [{0}]=>\n{1}".format(i, smallMatrix)) i+=1 print("Type of output1: {0}".format(type(output1))) newOutput1 = np.array(output1) print("Shape of output1: {0}".format(newOutput1.shape)) print() print("----vsplit----") output2 = np.vsplit(a, 2) i = 0 for smallMatrix in output2: print("np.vsplit(a, 2) [{0}]=>{1}".format(i, smallMatrix)) i+=1 print() print("Type of output2: {0}".format(type(output2))) newOutput2 = np.array(output2) print("Shape of output2: {0}".format(newOutput2.shape)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
a=> [[ 10 20 30 40 50 60] [ 70 80 90 100 110 120]] ----hsplit---- np.hsplit(a, 3) [0]=> [[10 20] [70 80]] np.hsplit(a, 3) [1]=> [[ 30 40] [ 90 100]] np.hsplit(a, 3) [2]=> [[ 50 60] [110 120]] Type of output1: <class 'list'> Shape of output1: (3, 2, 2) ----vsplit---- np.vsplit(a, 2) [0]=>[[10 20 30 40 50 60]] np.vsplit(a, 2) [1]=>[[ 70 80 90 100 110 120]] Type of output2: <class 'list'> Shape of output2: (2, 1, 6) |