Numpy ndarray:多次元配列オブジェクト


NumPyは現在python数値計算において最も重要な基礎パッケージであり、その核心的特徴の一つはN次元数グループオブジェクトであるndarrayであり、この博文では主にこの多次元同類データコンテナを紹介する.
文書ディレクトリ
  • 生成ndarray
  • Numpy配列算術
  • インデックスとスライス
  • 配列転置
  • ndarrayの生成
    ndarrayに含まれる各要素は同じタイプです.配列を生成する関数はたくさんありますが、ここではいくつかのよく使われるものを紹介します.
    #   NumPy
    import NumPy as np
    
  • np.array()パラメータはシーケンス型オブジェクトで、入力データのデータ型を自動的に推定し、作成時に次元ndminと数値型dtypeを指定できます.
  • np.array("love")
    

    output:
    array('love', dtype='
  • np.zeros()パラメータは、d 0,d 1,d 2,dnに関するメタグループであり、全0配列
  • を返す
    np.zeros((2,3,4))
    

    output:
    array([[[0., 0., 0., 0.],
            [0., 0., 0., 0.],
            [0., 0., 0., 0.]],
    
           [[0., 0., 0., 0.],
            [0., 0., 0., 0.],
            [0., 0., 0., 0.]]])
    
  • np.ones()パラメータはd 0,d 1,d 2,dnに関するメタグループであり,全1配列
  • を返す.
    np.ones((2,3,4))
    

    output:
    array([[[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]],
    
           [[1., 1., 1., 1.],
            [1., 1., 1., 1.],
            [1., 1., 1., 1.]]])
    
  • np.Empty()パラメータは、d 0,d 1,d 2,dnに関するメタグループであり、初期化値のない空の配列
  • を返す
    np.empty((2,1,3))
    

    output:
    array([[[0., 0., 0.]],
    
           [[0., 0., 0.]]])
    
  • np.arang()内蔵関数rangeの配列版.パラメータは開始値、終了値(取得不可)、ステップ長
  • np.arange(2,15,3)
    

    output:
    array([ 2,  5,  8, 11, 14])
    
  • np.linspace().パラメータは、開始値、終了値(取り込み)、要素の数です.
  • np.linspace(10,20,5)
    np.linspace(0,1,10,endpoint=False)
    

    output:
    array([10. , 12.5, 15. , 17.5, 20. ])
    array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
    
  • np.logspace().上のnpと.linspace()類似
  • np.logspace(0,2,20)
    

    output:
    array([  1.        ,   1.27427499,   1.62377674,   2.06913808,
             2.6366509 ,   3.35981829,   4.2813324 ,   5.45559478,
             6.95192796,   8.8586679 ,  11.28837892,  14.38449888,
            18.32980711,  23.35721469,  29.76351442,  37.92690191,
            48.32930239,  61.58482111,  78.47599704, 100.        ])
    

    8.np.eye()は、対角線が1、残りが0の2次元配列を返し、最初のパラメータはnumbers of rows、2番目のパラメータはnumbers of columnsで、デフォルトは最初のパラメータの値に等しい.
    np.eye(5)
    

    output:
    array([[1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 1., 0.],
           [0., 0., 0., 0., 1.]])
    

    次に、いくつかのndarrayのプロパティについて説明します.
    #      ,(0,1)         
    data = np.random.randn(2,3)
    data
    #         
    data.shape
    #    
    data.dtype
    #    
    data.ndim
    

    output:
    array([[ 0.71552267,  1.12464515,  0.84971133],
           [-0.43746949,  1.12846303, -0.29032458]])
           
    (2, 3)
    
    dtype('float64')
    
    2
    

    配列のデータ型をastype法を用いて変換することができ,この方法は常に新しい配列を生成することに注目すべきである.
    data.astype(np.int32)
    data
    

    output:
    array([[0, 1, 0],
           [0, 1, 0]])
    
    array([[ 0.71552267,  1.12464515,  0.84971133],
           [-0.43746949,  1.12846303, -0.29032458]])
    

    Numpy配列算術
    2つの等寸法配列間の算術操作には、要素単位の操作が適用されます.
    arr = np.array([[1,2,3],[4,5,6]])
    arr * arr
    arr - arr
    1/arr
    arr * 0.5
    #          ,          
    arr2 = np.array([[2,4,6],[1,2,3]])
    arr2 > arr
    

    out:
    array([[ 1,  4,  9],
           [16, 25, 36]])
    
    array([[0, 0, 0],
           [0, 0, 0]])
    
    array([[1.        , 0.5       , 0.33333333],
           [0.25      , 0.2       , 0.16666667]])
    
    array([[0.5, 1. , 1.5],
           [2. , 2.5, 3. ]])
    
    array([[ True,  True,  True],
           [False, False, False]])
    

    索引とスライス
  • 一次元配列のインデックスとスライスはpythonリストの使い方と少し似ています
  • #      
    arr = np.arange(10)
    arr
    

    Out:
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    #     ,                       ,             ,               
    arr[5:8]=12
    arr
    

    Out:
    array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
    
    #  aar1 ,         
    arr1 = arr[5:8]
    arr1
    arr1[:] = 24
    arr
    

    Out:
    array([12, 12, 12])
    
    array([ 0,  1,  2,  3,  4, 24, 24, 24,  8,  9])
    
    #           .copy()
    arr11 = arr[5:8].copy()
    arr11
    arr11[:] = 48#  aar11 ,         
    arr
    

    Out:
    array([24, 24, 24])
    
    array([ 0,  1,  2,  3,  4, 24, 24, 24,  8,  9])
    
  • 2次元配列のインデックス、2次元配列の各インデックス値に対応する要素は1次元配列
  • #        
    arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
    #     
    arr2d[2]
    #     ,   
    arr2d[2][0]
    #     ,   
    arr2d[2,0]
    #         
    arr2d[[2,0]]
    

    Out:
    array([7, 8, 9])
    7
    7
    array([[7, 8, 9],
           [1, 2, 3]])
    
  • 2次元配列のスライス
  • #      
    arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
    #     
    arr2d[:2]
    #             
    arr2d[:2,1:]
    

    Out:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    array([[2, 3],
           [5, 6]])
    

    スライス式に値を割り当てると、スライス全体が再割り当てされます.
    arr2d[:2,1:] = 0
    arr2d
    

    Out:
    array([[1, 0, 0],
           [4, 0, 0],
           [7, 8, 9]])
    
  • 3 D配列のインデックス
  • #       ,2*2*3   
    arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
    arr3d[0]
    arr3d[0,0]
    arr3d[0][0]
    

    Out:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    array([1, 2, 3])
    
    array([1, 2, 3])
    
  • ブール索引
  • #      names
    names = np.array(["aa","bb","aa","dd","ee","aa","gg"])
    #  randn               data
    data = np.random.randn(7,4)
    names
    data
    
    names == "aa"
    #         
    data[names == "aa"]
    

    Out:
    array(['aa', 'bb', 'aa', 'dd', 'ee', 'aa', 'gg'], dtype='
    #    !=          ~     
    data[names != "aa"]
    data[~(names == "aa")]
    cond = names == "aa"
    data[~cond]
    

    Out:
    array([[-0.18299815, -0.48641017,  0.90295139,  2.4727419 ],
           [ 0.71607019,  1.63065359, -0.71081597, -2.88685402],
           [ 0.59853369,  0.03907715, -0.21053569,  0.18792567],
           [ 0.68262773,  0.61233984, -1.23746087, -0.50847237]])
    
    array([[-0.18299815, -0.48641017,  0.90295139,  2.4727419 ],
           [ 0.71607019,  1.63065359, -0.71081597, -2.88685402],
           [ 0.59853369,  0.03907715, -0.21053569,  0.18792567],
           [ 0.68262773,  0.61233984, -1.23746087, -0.50847237]])
    
    array([[-0.18299815, -0.48641017,  0.90295139,  2.4727419 ],
           [ 0.71607019,  1.63065359, -0.71081597, -2.88685402],
           [ 0.59853369,  0.03907715, -0.21053569,  0.18792567],
           [ 0.68262773,  0.61233984, -1.23746087, -0.50847237]])
    
    #             ,       | &
    mask = (names == "aa")|(names == "bb")
    mask
    data[mask]
    #          ,         
    

    Out:
    array([ True,  True,  True, False, False,  True, False])
    
    array([[ 0.7416918 ,  0.88800978,  0.68197079, -0.53014663],
           [-0.18299815, -0.48641017,  0.90295139,  2.4727419 ],
           [-0.52766455, -0.36830999,  0.45128251,  0.48811192],
           [-0.1643565 ,  0.97845669, -0.92076973, -1.29995933]])
    

    はいれつてんい
    #       
    arr = np.arange(15).reshape((3,5))
    arr
    arr.T
    

    Out:
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    
    array([[ 0,  5, 10],
           [ 1,  6, 11],
           [ 2,  7, 12],
           [ 3,  8, 13],
           [ 4,  9, 14]])
    
    arr = np.random.randn(6,3)
    arr
    np.dot(arr.T,arr)#        
    

    Out:
    array([[ 0.58847723,  0.84348489,  1.42054432],
           [ 0.95521876, -1.13381903, -0.60993457],
           [-0.19601102,  0.40465638, -1.04277897],
           [-0.03255321,  0.40138796,  0.27147854],
           [-0.55308299, -0.57412833, -0.8741011 ],
           [ 0.51149413, -0.12046626,  0.41461565]])
    
    array([[ 1.86575541, -0.42313431,  1.14441965],
           [-0.42313431,  2.66600688,  2.02866315],
           [ 1.14441965,  2.02866315,  4.48701381]])
    

    transposeメソッドもswapaxesメソッドも配列をコピーしていません.データのビューを返します.元の配列は変わりません.
    #transpose              ,     ,      ,     
    arr = np.arange(16).reshape((2,2,4))
    arr
    arr.transpose((1,0,2))
    arr
    

    Out:
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    array([[[ 0,  1,  2,  3],
            [ 8,  9, 10, 11]],
    
           [[ 4,  5,  6,  7],
            [12, 13, 14, 15]]])
    
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    #swapaxes             ,             
    arr
    arr.swapaxes(1,2)
    arr
    

    Out:
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    
    array([[[ 0,  4],
            [ 1,  5],
            [ 2,  6],
            [ 3,  7]],
    
           [[ 8, 12],
            [ 9, 13],
            [10, 14],
            [11, 15]]])
    
    array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],
    
           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])
    

    ndarray多次元配列オブジェクトについては、他にも興味深い知識点がたくさんあります.関連する本やチュートリアルを探して勉強し続けることができます.