在python的numpy庫中有一個函數np.stack(), 看過一些博文後以爲別人寫的太複雜,而後本身有了一些理解以後作了一些比較簡單的解釋python
首先stack函數用於堆疊數組,其調用方式以下所示:數組
np.stack(arrays,axis=0)函數
其中arrays即須要進行堆疊的數組,axis是堆疊時使用的軸,好比:spa
arrays = [[1,2,3,4], [5,6,7,8]]code
這是一個二維數組,axis=0表示的是第一維,也便是arrays[0] = [1,2,3,4]或者arrays[1] = [5,6,7,8]input
axis=i時,表明在堆疊時首先選取第i維進行「打包」string
具體例子:io
當執行np.stack(arrays, axis=0)時,取出第一維的一、二、三、4,打包,[1, 2, 3, 4],其他的相似,而後結果以下:ast
當執行np.stack(arrays, axis=1)時,先對arrays中的第二維進行「打包」,也便是將一、5打包成[1, 5],其他的相似,結果以下:class
有這個「打包」的概念後,對於三維的數組堆疊也不難理解了,例如:
a = np.array([[1,2,3,4], [5,6,7,8]])
arrays = np.asarray([a, a , a])
執行np.stack(arrays, axis=0),也就是對第一維進行打包,結果以下:
執行np.stack(arrays, axis=1),也就是對第二維進行打包,取出第二維的元素[1,2,3,4]、[1,2,3,4]、[1,2,3,4],打包,[[1,2,3,4],[1,2,3,4],[1,2,3,4]],對其他的也作相似處理,結果以下:
執行np.stack(arrays, axis=2),與以前相似,取出第三維元素一、一、1,打包[1,1,1],結果以下:
總結而言,也就是arrays是你要進行堆疊的數組,axis控制你要將arrays中哪一個維度組合起來(也就是文中的「打包」)。
np.concatenate((a1,a2,a3,...), axis=0),這個函數就是按照特定方向軸進行拼接,默認是第一維,在numpy官網上的示例以下:
當axis=0時,將b的元素加到a的尾部,這裏比較難以理解的是第二個np.concatenate((a, b.T), axis=1),其實也相似,b.T的shape爲(1,2),axis=1,則在a的第二維加上b的每一個元素,因此這裏axis=i時, 輸入參數(a1,a2,a3...)除了第i維,其他維度的shape應該一致,例如:
這裏a的shape爲(2,2,3),b的shape爲(1,2,3),axis=0則要求a,b在其餘兩維的形狀是一致的,若是直接在其餘維度進行concatenate操做則會報錯(由於axis=1時,a和b在第一維的長度不一致):
下面一個例子可以說明:
np.hstack(tup), 按照列的方向堆疊, tup能夠是元組,列表,或者numpy數組, 其實也就是axis=1,即
np.hstack(tup) = np.concatenate(tup, axis=1)
按照上面對concatenate的理解則下面的示例很好理解
np.vstack(tup), 按照行的方向堆疊, tup能夠是元組,列表,或者numpy數組, 理解起來與上相同
np.vstack(tup) = np.concatenate(tup, axis=0)
對於第二段代碼,a的第一維元素分別時[1],[2],[3],因此堆疊時將b的對應元素直接加入
np.dstack(tup), 按照第三維方向堆疊,也便是
np.dstack(tup) = np.concatenate(tup, axis=2), 這裏較好理解,因此直接放官網的示例
np.column_stack函數將一維的數組堆疊爲二維數組,方向爲列
np.row_stack函數將一維的數組堆疊爲二維數組,方向爲行
其實若是對前面的內容理解以後這兩個算是比較簡單的了
其實也就是兩種操做,stack和concatenate,其中stack是首先找到axis軸的元素,而後對該軸的元素進行組合,而後造成新的數組,而concatenate則是在axis軸進行拓展,將a1,a2,a3...按照axis指定的軸進行增長操做...