未分類

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

本篇文章為筆者的學習筆記,參考書籍為
歐萊禮/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]]
分享到