numpy.stackの最も通俗的な理解

16412 ワード

numpy.stack(arrays, axis=0)
新しい軸に沿って配列のシーケンスを接続します.
axisパラメータは、結果寸法における新しい軸のインデックスを指定します.例えば、axis=0の場合、それは最初の次元であり、axis=-1の場合、それは最後の次元である.
  • パラメータ:配列:array_likeのシーケンスは各配列に同じ形状を持たなければならない.axis:int、配列がスタックされた結果配列の軸に沿ってオプションで入力します.
  • は、スタック:ndarrayスタック配列が入力配列より1つ多い次元を返します.

  • 上は公式に与えられた解釈で、理解しにくい.
    私たちはまず次元を増やすことから話します.
    >>> 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の2つの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の3つのarrayなので、ここ23になりました
    次に、このaxisパラメータの意味を説明すると、ここのaxisはどの次元を追加するか、例えばここのaxis=0は、第1の次元を増加するので、ここの(2,3)2は第1の位置にあることが理解できる.axis=1は、第2の次元を増加させるので、ここでの(3,2)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)の中で、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については、切らないで、2つの山が一緒にあります.
    こんなに簡単なんだよ!
    いいと思うから、いいねb( ̄▽ ̄)d