numpy-スタック関数stack(),hstack(),vstack()の詳細とパラメータaxis=0,1,2

6045 ワード

文書ディレクトリ
  • numpyにおけるaxisの値の説明
  • stack()関数
  • np.hstack()関数
  • np.vstack()関数
  • この3つの関数は少し似ていて、すべてスタック配列で、中で最も理解しにくいのはstack()関数だと思います.
    まずaxisの使い方を見て、stack()でわかりやすいです.
    numpyでのaxisの値の説明
    axis:0,1,2,3,...は外から剥がし、-n,-n+1,...,-3,-2,-1は中から剥がします.
    以下の理解を容易にするために、numpyに配列に[]マークが付いている場合、axis=0は最外層の[]に対応し、axis=1は第2外層の[]に対応し、このようにしてaxis=nは第n外層の[]に対応すると考えられる.
    次に、axis=0、axis=1の2つの例からnumpyを用いる.ndarray.sum()関数はnumpyにおけるaxisの使い方を深く理解する.
    numpy.ndarray.sum()
  • axis=Noneの場合、デフォルトではすべての要素に対して
  • を評価します.
    axis=0は、最外層[]内の最大単位ブロックに対してブロックとブロックの間の演算を行い、最外層[]を除去することを表す.
    a= np.array([1,2,3])    
    a.sum(axis = 0)
    >>>6
    

    1層[]しかないので、この層の最大単位を直接1,2,3で演算します.加算をした後は[6]はずだったが、最外層[]を除去すると[]は存在しなくなったので、戻ってきたのは6である.
    a= np.array([[1,2],[3,4]])  
    a.sum(axis = 0)
    >>>array([4, 6])
    

    2つの層[]があり、最外層[]の最大単位ブロックはそれぞれ[1,2],[3,4]であり、この2つの単位ブロックに対してブロックとブロックの間の演算を行い、[1,2]+[3,4]=[4,6];加算が完了すると[[4,6]]になるはずだったが、最外層[]を除去すると元の2層[]が1層[]になるので、結果は[4,6]に戻る.
    a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
    a.sum(axis = 0)
    >>>array([[12, 14], [16, 18]])
    
    

    3層[]があり、最外層[]の最大単位ブロックはそれぞれ[[1,2],[3,4]],[[11,12],[13,14]]であり、この2つの単位ブロックに対してブロックとブロックの間の演算を行い、[[1,2],[3,4]+[[11,12],[13,14]=[[12,14],[16,18]];加算が完了すると[[12,14],[16,18]]]]になるはずだったが,最外層[]を除去すると元の3層[]が2層[]になるので,[[12,14],[16,18]]に戻る.
    axis=1は、第2の外層[]の最大単位ブロックに対してブロックとブロックの間の演算を行い、同時に第2の外層[]を除去することを表す.
    a= np.array([1,2,3])    
    a.sum(axis = 1)
    >>>ValueError: 'axis' entry is out of bounds
    

    レイヤ[]のみなので、axisの値は1つだけで、0です.
    a= np.array([[1,2],[3,4]])  
    a.sum(axis = 1)
    >>>array([3, 7])
    
    >>> a=np.array([[2],[3]])
    >>> a.sum(axis=1)
    array([2, 3])
    

    2つの層[]があり、第2の外層[]の最大単位ブロックは2つのグループ(第2の外層[]が2つあるため)があり、第1のグループは1,2であり、第2のグループは3,4であり、それぞれこの2つの単位ブロックに対してブロックとブロックの間の演算を行い、第1のグループの結果は1+2=3であり、第2のグループの結果は3+4=7である.加算をした後は[[3],[7]]であるはずだったが,第2外層[]を除去すると,元の2層[]が1層[]になるので,結果は[3,7]に戻る.第2の例では、第2の層[]では、第1の[]の要素は1つの2しかなく、第2の[]の要素は1つの3しかなく、加算できる他の要素がないため、自身に戻り、最後に第2の層[]を除去して[2,3]
    a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
    a.sum(axis = 1)
    >>>array([[ 4,  6], [24, 26]])
    

    3層[]があり、第2外層[]の最大単位ブロックは2組(第2外層が2つあるため[])、第1組は[1,2],[3,4]、第2組は[11,12],[13,14]であり、それぞれこの2つの単位ブロックに対してブロックとブロックの間の演算を行い、第1組の結果は[1,2]+[3,4]=[4,6]、第2組の結果は[11,12]+[13,14]=[24,26]であった.加算が完了すると[[4,6]],[[24,26]]]]となるはずだったが,第2外層[]を除去すると元の3層[]が2層[]となるので,戻り結果は[[4,6],[24,26]]となる.
    axis=2,3,4,5も同様に解析した.
    >>> a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
    >>> a.sum(axis=2)
    array([[ 3,  7],
           [23, 27]])
    
    

    stack()関数
    関数のプロトタイプ:stack(arrays,axis=0)の主なパラメータは2つあります.
  • はarrays、すなわちスタックとして使用する配列であり、形状次元が
  • であることが要求される.
  • の2番目のパラメータはaxisです.つまり、どの次元でスタックするか(axisのデフォルトは0)
  • を指定します.
    axisの使い方を理解すれば、何に基づいてスタックされているのか、スタックする要素の次元を見つけて、対応する位置の要素をスタックすればいいのかも理解できます.
    例1
    >>> a=[[1,2,3],
    ...    [4,5,6]]
    >>> a
    [[1, 2, 3], [4, 5, 6]]
    >>> a[1][1]
    5
    >>> c=np.stack(a,axis=0) #axis=0      [ ] ,      [1, 2, 3],[4, 5, 6],    
    >>> c
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> c[1][1]
    5
    >>> c=np.stack(a,axis=1) #axis=1      [ ],      [ ]      1,2,3 4,5,6,          
    >>> c
    array([[1, 4],
           [2, 5],
           [3, 6]])
           
    >>> type(c)
    
    
    

    例2
    >>> a=[1,2,3,4]
    >>> b=[5,6,7,8]
    >>> c=[9,10,11,12]
    >>> d=np.stack((a,b,c),axis=0) #(a,b,c)   a,b,c         ,    
    >>> d
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    >>> 
    KeyboardInterrupt
    >>> d=np.stack((a,b,c),axis=1)
    >>> d
    array([[ 1,  5,  9],
           [ 2,  6, 10],
           [ 3,  7, 11],
           [ 4,  8, 12]])
    

    例3:3 Dの場合
    >>> a=[[1,2,3],
    ...    [4,5,6]]
    >>> b=[[1,2,3],
    ...    [4,5,6]]
    >>> c=[[1,2,3],
    ...    [4,5,6]]
    >>> a
    [[1, 2, 3], [4, 5, 6]]
    >>> b
    [[1, 2, 3], [4, 5, 6]]
    >>> c
    [[1, 2, 3], [4, 5, 6]]
    >>> d=np.stack((a,b,c),axis=0)
    >>> d
    array([[[1, 2, 3],
            [4, 5, 6]],
    
           [[1, 2, 3],
            [4, 5, 6]],
    
           [[1, 2, 3],
            [4, 5, 6]]])
    >>> d=np.stack((a,b,c),axis=1)
    >>> d
    array([[[1, 2, 3],
            [1, 2, 3],
            [1, 2, 3]],
    
           [[4, 5, 6],
            [4, 5, 6],
            [4, 5, 6]]])
    >>> d=np.stack((a,b,c),axis=2)
    >>> d
    array([[[1, 1, 1],
            [2, 2, 2],
            [3, 3, 3]],
    
           [[4, 4, 4],
            [5, 5, 5],
            [6, 6, 6]]])
    
    

    np.hstack()関数
    関数プロトタイプ:hstack(tup)、パラメータtupはメタグループ、リスト、またはnumpy配列であり、結果numpyの配列を返します.実は水平(列順)に配列を積み重ねて、vstack()関数はちょうど反対です.
    >>> a=[1,2,3]
    >>> b=[4,5,6]
    >>> np.hstack((a,b))
    array([1, 2, 3, 4, 5, 6])
    
    
    >>> a=[[1],[2],[3]]
    >>> b=[[1],[2],[3]]
    >>> c=[[1],[2],[3]]
    >>> d=[[1],[2],[3]]
    >>> np.hstack((a,b,c,d))
    array([[1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3]])
           
           
    >>> a=np.array([1,2,3])
    >>> a.shape
    (3,)   #3   
    
    
    

    注意、a=[[1],[2],[3]]は3行1列なので、横に積み重ねて1つに積み上げます
    一般的な状況:
  • [1,2]のshape値(2,)は、1次元配列を意味し、配列には2つの要素がある.
  • [[1],[2]]のshape値は(2,1)であり、2次元配列を意味し、行ごとに1つの要素がある.
  • [[1,2]]のshape値は(1,2)であり、2次元配列を意味し、各行に2つの要素がある.

  • np.vstack()関数
    関数プロトタイプ:vstack(tup)、パラメータtupはメタグループ、リスト、またはnumpy配列であり、結果numpyの配列を返します.垂直(行順)に配列を積み重ねます.
    >>> a=[1,2,3]
    >>> b=[4,5,6]
    >>> np.vstack((a,b))
    array([[1, 2, 3],
           [4, 5, 6]])
    
    
    >>> a=[[1],[2],[3]]
    >>> b=[[1],[2],[3]]
    >>> c=[[1],[2],[3]]
    >>> d=[[1],[2],[3]]
    >>> np.vstack((a,b,c,d))
    array([[1],
           [2],
           [3],
           [1],
           [2],
           [3],
           [1],
           [2],
           [3],
           [1],
           [2],
           [3]])