【python】Numpy中stack(),hstack(),vstack()函數詳解

來源:互聯網
上載者:User

標籤:int   處理   pre   官方文檔   程式碼分析   imp   detail   下標   多少   

轉自 73380803

這三個函數有些相似性,都是堆疊數組,裡面最難理解的應該就是stack()函數了,我查閱了numpy的官方文檔,在網上又看了幾個大牛的部落格,發現他們也只是把numpy文檔的內容照搬,看完後還是不能理解,最後經過本人程式碼分析,算是理解了stack()函數增加維度含義。以下內容我會用通俗易懂的語言解釋,內容可能有點多,耐心看,如果哪裡說的不對,歡迎糾正!

1. stack()函數 
函數原型為:stack(arrays, axis=0),arrays可以傳數組和列表。axis的含義我下面會講解,我們先來看個例子,然後我會分析輸出結果。

>>>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中每個元素在相同的位置套箱子的一些小塊(這裡叫小塊這個名詞可能不洽當,但是大家明白就行)放在一起後,再套箱子,就是外面套個中括弧,這就是堆疊。

再看下面的代碼的輸出,測試下你理解的沒有。

>>>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]]

 

不知道和你想象的輸出一樣不一樣,還有另一種情況,先看下面的代碼。

>>>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元素都是一維變二維的情況,下面我們看看二維變三維是什麼樣的。

import numpy as npa=[[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],[4,5,6]],[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]

 

然後在最外面套箱子,變成

[[[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],[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],[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,1,1  ,  2,2,2  , 3,3,3],    [4,4,4  ,  5,5,5  , 6,6,6]]

 

然後在1,1,1 ………6,6,6的外面分別套箱子變成:

[    [[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的數組。看下面的代碼體會它的含義

import numpy as npa=[1,2,3]b=[4,5,6]print(np.hstack((a,b)))
輸出:
[1 2 3 4 5 6 ]

import numpy as npa=[[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的數組。看下面的代碼體會它的含義

import numpy as npa=[1,2,3]b=[4,5,6]print(np.vstack((a,b)))
輸出:
[[1 2 3] [4 5 6]]

import numpy as npa=[[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]]

它是垂直(按照行順序)的把數組給堆疊起來。

【python】Numpy中stack(),hstack(),vstack()函數詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.