Python資料科學學習筆記-Numpy陣列基礎操作

2019-07-08
2分鐘閱讀

本篇文章為筆者的學習筆記,參考書籍為 歐萊禮/Python資料科學學習手冊/Jake VanderPlas/何敏煌(譯) https://www.books.com.tw/products/0010774364

建立陣列的各種方式

內容全為0的陣列

np.zeros(10, dtype=np.int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

內容全為1的陣列

np.ones((3,5), dtype=np.int)
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])

填滿同一元素

np.full((3,5), 3.14, dtype=np.float)
array([[3.14, 3.14, 3.14, 3.14, 3.14],
       [3.14, 3.14, 3.14, 3.14, 3.14],
       [3.14, 3.14, 3.14, 3.14, 3.14]])

依序填滿的矩陣

np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

產生特定間隔數的陣列

np.linspace(0,1,5)
array([0.  , 0.25, 0.5 , 0.75, 1.  ])

隨機陣列

np.random.random((3,3))
array([[0.67008401, 0.66344056, 0.66557893],
       [0.211046  , 0.63600443, 0.51327634],
       [0.75571898, 0.94306233, 0.6197861 ]])

隨機常態分佈陣列

np.random.normal(0,1(3,3))
array([[ 1.04213031,  0.77624605, -0.42446014],
       [ 0.07087546,  0.81222484, -0.52451604],
       [ 1.98723693, -0.91196085,  0.78381324]])

隨機範圍整數矩陣

np.random.randint(0,10, 10)
array([9, 7, 5, 2, 0, 3, 9, 3, 3, 4])

單位矩陣

np.eye(5)
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.]])

未初始化矩陣

np.empty(5)
array([1., 1., 1., 1., 1.])

陣列屬性

x = np.random.randint(0,10,(2,3))

  • 陣列維度 : x.ndim => 2

  • 各維度大小 : x.shape => (2, 3)

  • 整個陣列總大小 : x.size => 6

  • 陣列的資料型態 : x.dtype => dtype(‘int32’)

  • 陣列元素的位元組大小 : x.itemsize => 4 (Bytes)

  • 陣列總位元組大小 : x.nbytes => 24 (Bytes)

陣列操作

x2 = np.array([[12, 5, 6, 1],
              [ 7, 6, 8, 8],
              [ 1, 6, 7, 7]])
  • 取得2列3欄 : x2[:2, :3]
array([[12,  5,  6],
       [ 7,  6,  8]])
  • 取得所有偶數欄 : x2[:3, ::2]
array([[12,  6],
       [ 7,  8],
       [ 1,  7]])
  • 取得陣列的第1列元素 : x2[:, 0]
array([12,  7,  1])
  • 取得陣列的第1欄元素 : x2[0, :]
array([12,  5,  6,  1])

所有陣列操作都是藉由參考來執行,會改變原變數的值
若不想改變原變數的值,則藉由np.array.copy()來執行

  • 陣列變形 x3 = np.arange(1,10)
    • 將x3更改為3x3矩陣 : x3.reshape(3,3)
    • 透過x3建立列向量(reshape) : x3.reshap(3, 1)
    • 透過x3建立列向量(newaxis) : x3[np.newaxis, :]
    • 透過x3建立欄向量(reshape) : x3.reshap(1, 3)
    • 透過x3建立欄向量(newaxis) : x3[:, np.newaxis]
  • 陣列的合併 np.concatenate, np.vstack(垂直堆疊), np.hstack(水平堆疊), np.dstack(3D)
    x = np.array([1,2,3])
    y = np.array([4,5,6])
    z = np.array([[99],
                  [99]])
    grid = np.array([[1,2,3],
                     [4,5,6]])
    
    
    • 合併陣列np.concatenate([x, y])

      [1,2,3,4,5,6]

    • 合併陣列np.concatenate(grid, grid)

      [[1,2,3],
       [4,5,6],
       [1,2,3],
       [4,5,6]]
      
    • 合併陣列np.concatenate(grid, grid, axis=1)

      [[1,2,3,1,2,3],
       [4,5,6,4,5,6]]
      
    • 垂直堆疊合併np.vstack(x, grid)

      [[1, 2, 3],
       [1, 2, 3],
       [4, 5, 6]]
      
    • 水平堆疊合併np.hstack([z, grid])

      [[99,  1,  2,  3],
       [99,  4,  5,  6]]
      
  • 陣列的分割 np.split, np.vsplit(垂直分割), np.hsplit(水平分割)
    x = [1,2,3,99,99,3,2,1]
    grid = [[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11],
            [12, 13, 14, 15]]
    
    • 分割陣列np.split(x, [3,5])

      [1,2,3], [99,99], [3,2,1]
      
    • 垂直分割陣列np.vsplit(grid, [2])

      upper, lower = np.vsplit(grid, [2])
      upper = [[0, 1, 2, 3],
               [4, 5, 6, 7]]
      lower = [[ 8,  9, 10, 11],
               [12, 13, 14, 15]]
      
    • 水平分割陣列np.hvsplit(grid, [2])

      left, right = np.hsplit(grid, [2])
      left = [[ 0  1]
              [ 4  5]
              [ 8  9]
              [12 13]][[0, 1, 2, 3],
               [4, 5, 6, 7]]
      right = [[ 2  3]
               [ 6  7]
               [10 11]
               [14 15]][[ 8,  9, 10, 11],
               [12, 13, 14, 15]]
      
comments powered by Disqus