1.stack()函數
函數原型為:stack(arrays,axis=0),arrays可以傳數組和列表。axis的含義我下面會講解,我們先來看個例子,然后我會分析輸出結果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import numpy as np a = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] print ( "列表a如下:" ) print (a) print ( "增加一維,新維度的下標為0" ) c = np.stack(a,axis = 0 ) print (c) print ( "增加一維,新維度的下標為1" ) c = np.stack(a,axis = 1 ) print (c) 輸出: 列表a如下: [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] 增加一維,新維度下標為 0 [[ 1 2 3 ] [ 4 5 6 ]] 增加一維,新維度下標為 1 [[ 1 4 ] [ 2 5 ] [ 3 6 ]] |
首先這里arrays我傳的是一個列表,現在我開始講解這個stack()函數的意思,它就是對arrays里面的每個元素(可能是個列表,元組,或者是個numpy的數組)變成numpy的數組后,再對每個元素增加一維(至于維度加在哪里,是靠axis控制的),然后再把這些元素串起來(至于怎么串,我下面會說)。
arrays里面的每個元素必須形狀是一樣的,例如本例中列表a中的兩個元素[1,2,3]和[4,5,6]的形狀是一樣的,如果把[4,5,6]換成[4,5] ,那么程序會報錯!而axis代表的是在哪個維度上加一維,例如axis=0(它是默認的)代表的就是增加的這一維的下標為0,axis等于多少不是隨便亂寫的,如果參數arrays里面的每個元素是個1維的,那么調用stack()函數增加一維后會變成2維的,所以axis只能等于0和1(維度的下標是從0開始的),而參數axis=0和axis=1得到的結果是不一樣的。
例如上面的代碼中a列表中的第一個元素為[1,2,3],那么當axis=0的時候,就是在它的中括號外面再加一個中括號,變成[ [1,2,3] ](其實1,2,3之間是沒有逗號的,因為stack()函數會先把參數arrays中的每個元素變成numpy的數組,數組之間是沒有逗號的,看看上面的代碼輸出就知道了,這里大家明白就行,我為了方便講解,下面還會加上逗號),這樣最外面那層中括號才代表維度下標為0的那維;當axis=1的時候,就是在里面加個中括號,變成了[ [1],[2],[3] ],這樣里面加的那層中括號才代表維度下標為1的那維。同理當axis=0的時候[4,5,6]變成[ [ 4,5,6] ],當axis=1的時候,變成[ [4],[5],[6] ]。下面我們講如何把增加一維度后的每個元素串起來。
怎么把上面那兩個元素增加維度后的結果串起來呢,其實很簡單。現在我們已經知道了增加維度無非是增加中括號的意思,至于在哪里加中括號,取決于axis等于幾。我們把增加的中括號想像成一個個的箱子。還拿上面的代碼來說,當axis=0的時候,我們把套在[1,2,3]外面的中括號(就是[ [1,2,3] ]最外層的那個中括號)看做是箱子A,這個箱子A也會套在[4,5,6]的外面,所以我們就先把[1,2,3]和[4,5,6]放在一起,變成[1,2,3],[4,5,6],然后再一起套上箱子A,變成[ [1,2,3],[4,5,6] ]這就是當axis=0的時候程序的輸出結果。
現在再來看當axis=1的時候,對于[1,2,3],我們把套在1外面的箱子(就是上面講的[ [1],[2],[3] ]中1外面的那層中括號)看做A,套在2外面的看做B,套在3外面的看做C,同理,箱子A也會套在4的外面,箱子B也會套在5的外面,箱子C也會套在6的外面。那么我們就把1和4放一起,2和5放一起,3和6放一起,變成[ 1,4 ,2,5 ,3,6 ]然后把箱子A,B,C分別套在1,4 , 2,5 , 3,6的外面,變成[ [1,4] , [2,5] , [3,6] ]這就是程序中axis=1的時候程序的輸出結果。
大家發現了沒有,串起來的時候其實就是把arrays中每個元素在相同的位置套箱子的一些小塊(這里叫小塊這個名詞可能不洽當,但是大家明白就行)放在一起后,再套箱子,就是外面套個中括號,這就是堆疊。
再看下面的代碼的輸出,測試下你理解的沒有。
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
|
import numpy as np a = [[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ]] print ( "列表a如下:" ) print (a) print ( "增加一維,新維度的下標為0" ) c = np.stack(a,axis = 0 ) print (c) print ( "增加一維,新維度的下標為1" ) c = np.stack(a,axis = 1 ) print (c) 輸出: 列表a如下: [[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ]] 增加一維,新維度的下標為 0 [[ 1 2 3 4 ] [ 5 6 7 8 ] [ 9 10 11 12 ]] 增加一維,新維度的下標為 1 [[ 1 5 9 ] [ 2 6 10 ] [ 3 7 11 ] [ 4 8 12 ]] |
不知道和你想象的輸出一樣不一樣,還有另一種情況,先看下面的代碼。
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
|
import numpy as np a = [ 1 , 2 , 3 , 4 ] b = [ 5 , 6 , 7 , 8 ] c = [ 9 , 10 , 11 , 12 ] print ( "a=" ,a) print ( "b=" ,b) print ( "c=" ,c) print ( "增加一維,新維度的下標為0" ) d = np.stack((a,b,c),axis = 0 ) print (d) print ( "增加一維,新維度的下標為1" ) d = np.stack((a,b,c),axis = 1 ) print (d) 輸出: ( 'a=' , [ 1 , 2 , 3 , 4 ]) ( 'b=' , [ 5 , 6 , 7 , 8 ]) ( 'c=' , [ 9 , 10 , 11 , 12 ]) 增加一維,新維度的下標為 0 [[ 1 2 3 4 ] [ 5 6 7 8 ] [ 9 10 11 12 ]] 增加一維,新維度的下標為 1 [[ 1 5 9 ] [ 2 6 10 ] [ 3 7 11 ] [ 4 8 12 ]] |
你會發現輸出結果和上面的代碼一樣,其實它倆就是一樣的。只不過當你對arrays傳參的時候,如果你傳的參數是類似于(a,b,c)這種,它會把(a,b,c)當做一個元組來看,a,b,c都是元組的每個元素。然后分別對每個元素處理,上面我已經說了,arrays傳的參數可以是列表,元組,或者numpy數組。所以傳(a,b,c)和傳[a,b,c]或者當x=[a,b,c]的時候傳x,效果都是一樣的。
上面的代碼處理的arrays元素都是一維變二維的情況,下面我們看看二維變三維是什么樣的。
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
51
|
import numpy as np a = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] b = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] c = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]] print ( "a=" ,a) print ( "b=" ,b) print ( "c=" ,c) print ( "增加一維,新維度的下標為0" ) d = np.stack((a,b,c),axis = 0 ) print (d) print ( "增加一維,新維度的下標為1" ) d = np.stack((a,b,c),axis = 1 ) print (d) print ( "增加一維,新維度的下標為2" ) d = np.stack((a,b,c),axis = 2 ) print (d) 輸出: ( 'a=' , [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]]) ( 'b=' , [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]]) ( 'c=' , [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]]) 增加一維,新維度的下標為 0 [[[ 1 2 3 ] [ 4 5 6 ]] [[ 1 2 3 ] [ 4 5 6 ]] [[ 1 2 3 ] [ 4 5 6 ]]] 增加一維,新維度的下標為 1 [[[ 1 2 3 ] [ 1 2 3 ] [ 1 2 3 ]] [[ 4 5 6 ] [ 4 5 6 ] [ 4 5 6 ]]] 增加一維,新維度的下標為 2 [[[ 1 1 1 ] [ 2 2 2 ] [ 3 3 3 ]] [[ 4 4 4 ] [ 5 5 5 ] [ 6 6 6 ]]] |
當axis=0的時候,列表a,b,c最外面都需要套箱子(就是加中括號),那么我把你們先放一起,變成下面這樣
1
2
3
|
[[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]], [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]], [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]] |
然后在最外面套箱子,變成
1
2
3
4
5
|
[ [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]], [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]], [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]] ] |
當axis=1的時候,列表a,b,c中的[1,2,3]需要套同樣的箱子,列表a,b,c中的[4,5,6]需要套同樣的箱子,好,我先把你們放一塊變成下面這樣
1
2
3
4
5
6
|
[ [ 1 , 2 , 3 ],[ 1 , 2 , 3 ],[ 1 , 2 , 3 ] , [ 4 , 5 , 6 ],[ 4 , 5 , 6 ],[ 4 , 5 , 6 ] ] |
然后開始分別在 [1,2,3],[1,2,3],[1,2,3]的外面和[4,5,6],[4,5,6],[4,5,6]的外面套箱子,變成下面這樣
1
2
3
4
5
6
|
[ [[ 1 , 2 , 3 ],[ 1 , 2 , 3 ],[ 1 , 2 , 3 ]] , [[ 4 , 5 , 6 ],[ 4 , 5 , 6 ],[ 4 , 5 , 6 ]] ] |
當axis=2的時候,列表a,b,c中的1,2,3,4,5,6都需要套箱子,我把你們先放一起變成:
1
2
3
4
|
[ [ 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 ], [ 4 , 4 , 4 , 5 , 5 , 5 , 6 , 6 , 6 ] ] |
然后在1,1,1 ………6,6,6的外面分別套箱子變成:
1
2
3
4
|
[ [[ 1 , 1 , 1 ] , [ 2 , 2 , 2 ] , [ 3 , 3 , 3 ]], [[ 4 , 4 , 4 ] , [ 5 , 5 , 5 ] , [ 6 , 6 , 6 ]] ] |
關于stack()函數就講這么多,這也是我全部理解的部分。
2. hstack()函數
函數原型:hstack(tup) ,參數tup可以是元組,列表,或者numpy數組,返回結果為numpy的數組。看下面的代碼體會它的含義
1
2
3
4
5
6
|
import numpy as np a = [ 1 , 2 , 3 ] b = [ 4 , 5 , 6 ] print (np.hstack((a,b))) 輸出:[ 1 2 3 4 5 6 ] |
1
2
3
4
5
6
7
8
9
10
11
|
import numpy as np a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] c = [[ 1 ],[ 2 ],[ 3 ]] d = [[ 1 ],[ 2 ],[ 3 ]] print (np.hstack((a,b,c,d))) 輸出: [[ 1 1 1 1 ] [ 2 2 2 2 ] [ 3 3 3 3 ]] |
它其實就是水平(按列順序)把數組給堆疊起來,vstack()函數正好和它相反。
3. vstack()函數
函數原型:vstack(tup) ,參數tup可以是元組,列表,或者numpy數組,返回結果為numpy的數組。看下面的代碼體會它的含義
1
2
3
4
5
6
7
8
|
import numpy as np a = [ 1 , 2 , 3 ] b = [ 4 , 5 , 6 ] print (np.vstack((a,b))) 輸出: [[ 1 2 3 ] [ 4 5 6 ]] |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import numpy as np a = [[ 1 ],[ 2 ],[ 3 ]] b = [[ 1 ],[ 2 ],[ 3 ]] c = [[ 1 ],[ 2 ],[ 3 ]] d = [[ 1 ],[ 2 ],[ 3 ]] print (np.vstack((a,b,c,d))) 輸出: [[ 1 ] [ 2 ] [ 3 ] [ 1 ] [ 2 ] [ 3 ] [ 1 ] [ 2 ] [ 3 ] [ 1 ] [ 2 ] [ 3 ]] |
它是垂直(按照行順序)的把數組給堆疊起來。
總結
以上就是本文關于Numpy中stack(),hstack(),vstack()函數用法介紹及實例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/csdn15698845876/article/details/73380803