在python的numpy庫中有一個函數np.stack(), 看過一些博文后覺得別人寫的太復雜,然后自己有了一些理解之后做了一些比較簡單的解釋
np.stack
首先stack函數用於堆疊數組,其調用方式如下所示:
np.stack(arrays,axis=0)
其中arrays即需要進行堆疊的數組,axis是堆疊時使用的軸,比如:
arrays = [[1,2,3,4], [5,6,7,8]]
這是一個二維數組,axis=0表示的是第一維,也即是arrays[0] = [1,2,3,4]或者arrays[1] = [5,6,7,8]
axis=i時,代表在堆疊時首先選取第i維進行“打包”
具體例子:
當執行np.stack(arrays, axis=0)時,取出第一維的1、2、3、4,打包,[1, 2, 3, 4],其余的類似,然后結果如下:
-
-
-
-
array([[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]])
當執行np.stack(arrays, axis=1)時,先對arrays中的第二維進行“打包”,也即是將1、5打包成[1, 5],其余的類似,結果如下:
-
-
array([[ 1, 5],
-
[ 2, 6],
-
[ 3, 7],
-
[ 4, 8]])
有這個“打包”的概念后,對於三維的數組堆疊也不難理解了,例如:
a = np.array([[1,2,3,4], [5,6,7,8]])
arrays = np.asarray([a, a , a])
-
-
array([[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]],
-
-
[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]],
-
-
[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]]])
執行np.stack(arrays, axis=0),也就是對第一維進行打包,結果如下:
-
-
array([[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]],
-
-
[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]],
-
-
[[ 1, 2, 3, 4],
-
[ 5, 6, 7, 8]]])
執行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]],對其余的也做類似處理,結果如下:
-
-
array([[[ 1, 2, 3, 4],
-
[ 1, 2, 3, 4],
-
[ 1, 2, 3, 4]],
-
-
[[ 5, 6, 7, 8],
-
[ 5, 6, 7, 8],
-
[ 5, 6, 7, 8]]])
執行np.stack(arrays, axis=2),與之前類似,取出第三維元素1、1、1,打包[1,1,1],結果如下:
-
-
array([[[ 1, 1, 1],
-
[ 2, 2, 2],
-
[ 3, 3, 3],
-
[ 4, 4, 4]],
-
-
[[ 5, 5, 5],
-
[ 6, 6, 6],
-
[ 7, 7, 7],
-
[ 8, 8, 8]]])
總結而言,也就是arrays是你要進行堆疊的數組,axis控制你要將arrays中哪個維度組合起來(也就是文中的“打包”)。
np.concatenate
np.concatenate((a1,a2,a3,...), axis=0),這個函數就是按照特定方向軸進行拼接,默認是第一維,在numpy官網上的示例如下:
-
-
-
-
array([[ 1, 2],
-
[ 3, 4],
-
[ 5, 6]])
-
-
array([[ 1, 2, 5],
-
[ 3, 4, 6]])
當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應該一致,例如:
-
-
-
-
array([[[ 1, 2, 3],
-
[ 4, 5, 6]],
-
-
[[ 1, 2, 3],
-
[ 4, 5, 6]],
-
-
[[ 1, 2, 3],
-
[ 4, 5, 6]]])
這里a的shape為(2,2,3),b的shape為(1,2,3),axis=0則要求a,b在其他兩維的形狀是一致的,如果直接在其他維度進行concatenate操作則會報錯(因為axis=1時,a和b在第一維的長度不一致):
-
-
Traceback (most recent call last):
-
File "<stdin>", line 1, in <module>
-
ValueError: all the input array dimensions except for the concatenation axis must match exactly
-
-
Traceback (most recent call last):
-
File "<stdin>", line 1, in <module>
-
ValueError: all the input array dimensions except for the concatenation axis must match exactly
下面一個例子能夠說明:
-
-
-
array([[[ 5, 6, 7],
-
[ 7, 8, 9]],
-
-
[[ 4, 5, 6],
-
[ 5, 6, 7]]])
-
-
( 2, 2, 3)
-
-
array([[[ 1, 2, 3],
-
[ 4, 5, 6],
-
[ 5, 6, 7],
-
[ 7, 8, 9]],
-
-
[[ 1, 2, 3],
-
[ 4, 5, 6],
-
[ 4, 5, 6],
-
[ 5, 6, 7]]])
-
-
array([[[ 1, 2, 3, 5, 6, 7],
-
[ 4, 5, 6, 7, 8, 9]],
-
-
[[ 1, 2, 3, 4, 5, 6],
-
[ 4, 5, 6, 5, 6, 7]]])
np.hstack
np.hstack(tup), 按照列的方向堆疊, tup可以是元組,列表,或者numpy數組, 其實也就是axis=1,即
np.hstack(tup) = np.concatenate(tup, axis=1)
按照上面對concatenate的理解則下面的示例很好理解
-
-
-
-
array([ 1, 2, 3, 2, 3, 4])
-
-
-
-
array([[ 1, 2],
-
[ 2, 3],
-
[ 3, 4]])
np.vstack
np.vstack(tup), 按照行的方向堆疊, tup可以是元組,列表,或者numpy數組, 理解起來與上相同
np.vstack(tup) = np.concatenate(tup, axis=0)
-
-
-
-
array([[ 1, 2, 3],
-
[ 2, 3, 4]])
-
-
-
-
array([[ 1],
-
[ 2],
-
[ 3],
-
[ 2],
-
[ 3],
-
[ 4]])
對於第二段代碼,a的第一維元素分別時[1],[2],[3],所以堆疊時將b的對應元素直接加入
np.dstack
np.dstack(tup), 按照第三維方向堆疊,也即是
np.dstack(tup) = np.concatenate(tup, axis=2), 這里較好理解,所以直接放官網的示例
-
-
-
-
array([[[ 1, 2],
-
[ 2, 3],
-
[ 3, 4]]])
-
-
-
-
array([[[ 1, 2]],
-
[[ 2, 3]],
-
[[ 3, 4]]])
np.column_stack和np.row_stack
np.column_stack函數將一維的數組堆疊為二維數組,方向為列
np.row_stack函數將一維的數組堆疊為二維數組,方向為行
其實如果對前面的內容理解之后這兩個算是比較簡單的了
-
-
-
-
array([[ 1, 2],
-
[ 2, 3],
-
[ 3, 4]])
-
-
array([[ 1, 2, 3],
-
[ 4, 5, 6]])
總結
其實也就是兩種操作,stack和concatenate,其中stack是首先找到axis軸的元素,然后對該軸的元素進行組合,然后形成新的數組,而concatenate則是在axis軸進行拓展,將a1,a2,a3...按照axis指定的軸進行增加操作...
