numpy中數據合併,stack ,concentrate,vstack,hstack

在python的numpy庫中有一個函數np.stack(), 看過一些博文後以爲別人寫的太複雜,而後本身有了一些理解以後作了一些比較簡單的解釋python

 

np.stack

首先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

  1.  
    >>> arrays = [[1,2,3,4], [5,6,7,8]]
  2.  
    >>> arrays=np.array(arrays)
  3.  
    >>> np.stack(arrays,axis=0)
  4.  
    array([[ 1, 2, 3, 4],
  5.  
    [ 5, 6, 7, 8]])

當執行np.stack(arrays, axis=1)時,先對arrays中的第二維進行「打包」,也便是將一、5打包成[1, 5],其他的相似,結果以下:class

  1.  
    >>> np.stack(arrays, axis=1)
  2.  
    array([[ 1, 5],
  3.  
    [ 2, 6],
  4.  
    [ 3, 7],
  5.  
    [ 4, 8]])

 

有這個「打包」的概念後,對於三維的數組堆疊也不難理解了,例如:

a = np.array([[1,2,3,4], [5,6,7,8]])

arrays = np.asarray([a, a , a])

  1.  
    >>> arrays
  2.  
    array([[[ 1, 2, 3, 4],
  3.  
    [ 5, 6, 7, 8]],
  4.  
     
  5.  
    [[ 1, 2, 3, 4],
  6.  
    [ 5, 6, 7, 8]],
  7.  
     
  8.  
    [[ 1, 2, 3, 4],
  9.  
    [ 5, 6, 7, 8]]])

執行np.stack(arrays, axis=0),也就是對第一維進行打包,結果以下:

  1.  
    >>> np.stack(arrays, axis=0)
  2.  
    array([[[ 1, 2, 3, 4],
  3.  
    [ 5, 6, 7, 8]],
  4.  
     
  5.  
    [[ 1, 2, 3, 4],
  6.  
    [ 5, 6, 7, 8]],
  7.  
     
  8.  
    [[ 1, 2, 3, 4],
  9.  
    [ 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]],對其他的也作相似處理,結果以下:

  1.  
    >>> np.stack(arrays, axis=1)
  2.  
    array([[[ 1, 2, 3, 4],
  3.  
    [ 1, 2, 3, 4],
  4.  
    [ 1, 2, 3, 4]],
  5.  
     
  6.  
    [[ 5, 6, 7, 8],
  7.  
    [ 5, 6, 7, 8],
  8.  
    [ 5, 6, 7, 8]]])

執行np.stack(arrays, axis=2),與以前相似,取出第三維元素一、一、1,打包[1,1,1],結果以下:

  1.  
    >>> np.stack(arrays, axis=2)
  2.  
    array([[[ 1, 1, 1],
  3.  
    [ 2, 2, 2],
  4.  
    [ 3, 3, 3],
  5.  
    [ 4, 4, 4]],
  6.  
     
  7.  
    [[ 5, 5, 5],
  8.  
    [ 6, 6, 6],
  9.  
    [ 7, 7, 7],
  10.  
    [ 8, 8, 8]]])

 

總結而言,也就是arrays是你要進行堆疊的數組,axis控制你要將arrays中哪一個維度組合起來(也就是文中的「打包」)。

 

np.concatenate

 

np.concatenate((a1,a2,a3,...), axis=0),這個函數就是按照特定方向軸進行拼接,默認是第一維,在numpy官網上的示例以下:

  1.  
    >>> a = np.array([[1, 2], [3, 4]])
  2.  
    >>> b = np.array([[5, 6]])
  3.  
    >>> np.concatenate((a, b), axis=0)
  4.  
    array([[ 1, 2],
  5.  
    [ 3, 4],
  6.  
    [ 5, 6]])
  7.  
    >>> np.concatenate((a, b.T), axis=1)
  8.  
    array([[ 1, 2, 5],
  9.  
    [ 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應該一致,例如:

  1.  
    >>> a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
  2.  
    >>> b = np.array([[[1,2,3],[4,5,6]]])
  3.  
    >>> np.concatenate((a, b), axis=0)
  4.  
    array([[[ 1, 2, 3],
  5.  
    [ 4, 5, 6]],
  6.  
     
  7.  
    [[ 1, 2, 3],
  8.  
    [ 4, 5, 6]],
  9.  
     
  10.  
    [[ 1, 2, 3],
  11.  
    [ 4, 5, 6]]])

這裏a的shape爲(2,2,3),b的shape爲(1,2,3),axis=0則要求a,b在其餘兩維的形狀是一致的,若是直接在其餘維度進行concatenate操做則會報錯(由於axis=1時,a和b在第一維的長度不一致):

  1.  
    >>> np.concatenate((a, b), axis=1)
  2.  
    Traceback (most recent call last):
  3.  
    File "<stdin>", line 1, in <module>
  4.  
    ValueError: all the input array dimensions except for the concatenation axis must match exactly
  5.  
    >>> np.concatenate((a, b), axis=2)
  6.  
    Traceback (most recent call last):
  7.  
    File "<stdin>", line 1, in <module>
  8.  
    ValueError: all the input array dimensions except for the concatenation axis must match exactly

下面一個例子可以說明:

  1.  
    >>> c=np.array([[[5,6,7],[7,8,9]],[[4,5,6],[5,6,7]]])
  2.  
    >>> c
  3.  
    array([[[ 5, 6, 7],
  4.  
    [ 7, 8, 9]],
  5.  
     
  6.  
    [[ 4, 5, 6],
  7.  
    [ 5, 6, 7]]])
  8.  
    >>> c.shape
  9.  
    ( 2, 2, 3)
  10.  
    >>> np.concatenate((a, c), axis=1)
  11.  
    array([[[ 1, 2, 3],
  12.  
    [ 4, 5, 6],
  13.  
    [ 5, 6, 7],
  14.  
    [ 7, 8, 9]],
  15.  
     
  16.  
    [[ 1, 2, 3],
  17.  
    [ 4, 5, 6],
  18.  
    [ 4, 5, 6],
  19.  
    [ 5, 6, 7]]])
  20.  
    >>> np.concatenate((a, c), axis=2)
  21.  
    array([[[ 1, 2, 3, 5, 6, 7],
  22.  
    [ 4, 5, 6, 7, 8, 9]],
  23.  
     
  24.  
    [[ 1, 2, 3, 4, 5, 6],
  25.  
    [ 4, 5, 6, 5, 6, 7]]])

 

 

np.hstack

np.hstack(tup),  按照列的方向堆疊, tup能夠是元組,列表,或者numpy數組, 其實也就是axis=1,即

np.hstack(tup) = np.concatenate(tup, axis=1)

按照上面對concatenate的理解則下面的示例很好理解

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.hstack((a,b))
  4.  
    array([ 1, 2, 3, 2, 3, 4])
  5.  
    >>> a = np.array([[1],[2],[3]])
  6.  
    >>> b = np.array([[2],[3],[4]])
  7.  
    >>> np.hstack((a,b))
  8.  
    array([[ 1, 2],
  9.  
    [ 2, 3],
  10.  
    [ 3, 4]])

 

np.vstack

np.vstack(tup),  按照行的方向堆疊, tup能夠是元組,列表,或者numpy數組, 理解起來與上相同

np.vstack(tup) = np.concatenate(tup, axis=0)

  1.  
    >>> a = np.array([1, 2, 3])
  2.  
    >>> b = np.array([2, 3, 4])
  3.  
    >>> np.vstack((a,b))
  4.  
    array([[ 1, 2, 3],
  5.  
    [ 2, 3, 4]])
  1.  
    >>> a = np.array([[1], [2], [3]])
  2.  
    >>> b = np.array([[2], [3], [4]])
  3.  
    >>> np.vstack((a,b))
  4.  
    array([[ 1],
  5.  
    [ 2],
  6.  
    [ 3],
  7.  
    [ 2],
  8.  
    [ 3],
  9.  
    [ 4]])

對於第二段代碼,a的第一維元素分別時[1],[2],[3],因此堆疊時將b的對應元素直接加入

 

np.dstack

np.dstack(tup), 按照第三維方向堆疊,也便是

np.dstack(tup) = np.concatenate(tup, axis=2), 這裏較好理解,因此直接放官網的示例

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.dstack((a,b))
  4.  
    array([[[ 1, 2],
  5.  
    [ 2, 3],
  6.  
    [ 3, 4]]])
  1.  
    >>> a = np.array([[1],[2],[3]])
  2.  
    >>> b = np.array([[2],[3],[4]])
  3.  
    >>> np.dstack((a,b))
  4.  
    array([[[ 1, 2]],
  5.  
    [[ 2, 3]],
  6.  
    [[ 3, 4]]])

 

np.column_stack和np.row_stack

np.column_stack函數將一維的數組堆疊爲二維數組,方向爲列

np.row_stack函數將一維的數組堆疊爲二維數組,方向爲行

其實若是對前面的內容理解以後這兩個算是比較簡單的了

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.column_stack((a,b))
  4.  
    array([[ 1, 2],
  5.  
    [ 2, 3],
  6.  
    [ 3, 4]])
  1.  
    >>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
  2.  
    array([[ 1, 2, 3],
  3.  
    [ 4, 5, 6]])

 

總結

其實也就是兩種操做,stack和concatenate,其中stack是首先找到axis軸的元素,而後對該軸的元素進行組合,而後造成新的數組,而concatenate則是在axis軸進行拓展,將a1,a2,a3...按照axis指定的軸進行增長操做...

相關文章
相關標籤/搜索