本文爲轉載,原博客地址:https://blog.csdn.net/qq_17550379/article/details/78934529
numpy.stack(arrays, axis=0)
沿着新軸連接數組的序列。
axis參數指定新軸在結果尺寸中的索引。例如,如果axis=0
,它將是第一個維度,如果axis=-1
,它將是最後一個維度。
- 參數: 數組:array_like的序列每個數組必須具有相同的形狀。axis:int,可選輸入數組沿其堆疊的結果數組中的軸。
- 返回: 堆疊:ndarray堆疊數組比輸入數組多一個維。
上面是官方給出的解釋,很難理解。
我們先從增加維度說起。
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 3, 4])
>>> a.shape
(3,)
>>> b.shape
(3,)
>>> np.stack((a, b), axis=0).shape
(2, 3)
>>> np.stack((a, b), axis=1).shape
(3, 2)
我先說一說這裏(2,3)
和(3,2)
中的2
是怎麼來的:因爲有a
和b
兩個array
。如果這裏我們增加一個c= np.array([3, 4, 5])
,那麼這裏我們改變原來的np.stack
就會變成下面這樣:
>>> c = np.array([3, 4, 5])
>>> np.stack((a, b, c), axis=0).shape
(3, 3)
>>> np.stack((a, b, c), axis=1).shape
(3, 3)
那麼因爲這裏是a,b,c
三個array
,所以這裏2
變成了3
接着說說這個axis
參數的意義,我們可以理解這裏的axis
就是要增加哪一個維度,比如說這裏的axis=0
,就是增加第一維度,所以這裏的(2,3)
中的2
在第一個位置。axis=1
,就是增加第二維度,所以這裏的(3,2)
中的2
在第二個位置。
我現在舉一個稍微複雜的例子
>>> a = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
>>> b = np.array([[4, 5, 6], [4, 5, 6], [4, 5, 6]])
>>> a.shape
(3, 3)
>>> b.shape
(3, 3)
>>> np.stack((a, b), axis=0).shape
(2, 3, 3)
>>> np.stack((a, b), axis=1).shape
(3, 2, 3)
>>> np.stack((a, b), axis=2).shape
(3, 3, 2)
這裏的2
就是指的a
和b
,而2
放在什麼位置是根據axis
來確定的。
接着說一下矩陣的座標
a a的元素對應的座標
[1 2 3] (0,0) (0,1) (0,2)
[1 2 3] (1,0) (1,1) (1,2)
[1 2 3] (2,0) (2,1) (2,2)
很好理解。
接着以np.stack((a, b), axis=1)
爲例子
>>> np.stack((a, b), axis=1).shape
(3, 2, 3)
>>> np.stack((a, b), axis=1)
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
原來我們a[0][0]=1
,現在中間加上一個維度(因爲這裏axis=1
),就變成了a[0][0][0]=1
,注意這裏爲什麼中間是0
,因爲np.stack((a, b), axis=1)
中,a
在b
的前面。同理
a a的元素對應的座標
[1 2 3] (0,0,0) (0,0,1) (0,0,2)
[1 2 3] (1,0,0) (1,0,1) (1,0,2)
[1 2 3] (2,0,0) (2,0,1) (2,0,2)
那麼b[0][0]=4
,因爲np.stack((a, b), axis=1)
中,b
在a
的後面。所以b[0][1][0]=4
b b的元素對應的座標
[4 5 6] (0,1,0) (0,1,1) (0,1,2)
[4 5 6] (1,1,0) (1,1,1) (1,1,2)
[4 5 6] (2,1,0) (2,1,1) (2,1,2)
接着將對應座標的數組合,就得到了新的array
元素對應的座標
array([[[1, 2, 3], (0,0,0) (0,0,1) (0,0,2)
[4, 5, 6]], (0,1,0) (0,1,1) (0,1,2)
[[1, 2, 3], (1,0,0) (1,0,1) (1,0,2)
[4, 5, 6]], (1,1,0) (1,1,1) (1,1,2)
[[1, 2, 3], (2,0,0) (2,0,1) (2,0,2)
[4, 5, 6]]]) (2,1,0) (2,1,1) (2,1,2)
還有一個更加簡單的理解方式(堆疊)
對於axis=1
,就是橫着切開,對應行橫着堆
對於axis=2
,就是橫着切開,對應行豎着堆
對於axis=0
,就是不切開,兩個堆一起。
就是這麼的簡單^_^!
覺得不錯,點個贊吧b( ̄▽ ̄)d