numpy.stack最通俗的理解

本文爲轉載,原博客地址: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是怎麼來的:因爲有ab兩個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就是指的ab,而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)中,ab的前面。同理

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)中,ba的後面。所以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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章