[筆記] numpy 用法 (2) 索引 合併 分割 複製

numpy 筆記 (2)

numpy array 的 index (索引)

  • 找出矩陣當中最大最小值所在的位置 index (索引值): argmin, argmax
    #coding=utf-8 import numpy as np a = np.arange(2,14).reshape(3,4) print(a) # [[ 2 3 4 5] # [ 6 7 8 9] # [10 11 12 13]] # 最小值的索引 print(np.min(a)) # 2 最小值 print(np.argmin(a)) # 0 最小值的索引 # 最大值的索引 print(np.max(a)) # 13 最大值 print(np.argmax(a)) # 11 最大值的索引
  • Numpy Array Indexing
    #coding=utf-8 import numpy as np a = np.arange(3,15).reshape(3,4) print(a) ''' [[ 3 4 5 6] [ 7 8 9 10] [11 12 13 14]] ''' # 以下兩種寫法相等 print(a[2][1]) # 12 print(a[2,1]) # 12 # 指定印出 使用 : 設定範圍 print(a[:,:]) ''' [[ 3 4 5 6] [ 7 8 9 10] [11 12 13 14]] ''' print(a[1:,:]) ''' [[ 7 8 9 10] [11 12 13 14]] ''' print(a[0:2,:]) ''' [[ 3 4 5 6] [ 7 8 9 10]] ''' print(a[:,1:]) ''' [[ 4 5 6] [ 8 9 10] [12 13 14]] ''' print(a[:,1:3]) ''' [[ 4 5] [ 8 9] [12 13]] '''
  • 使用 for 與 transpose
    # for 預設是可以迭代每一 row (橫向) for row in a: print(row) ''' [3 4 5 6] [ 7 8 9 10] [11 12 13 14] ''' # 使用 transpose 搭配 for 迭代印出每一 column (直向) for column in a.T: print(column) ''' [ 3 7 11] [ 4 8 12] [ 5 9 13] [ 6 10 14] '''
  • 使用 flatten 與 flat 把二維 array 攤平
    # 使用 flatten (flat 是迭代版本) print(a.flatten()) # [ 3 4 5 6 7 8 9 10 11 12 13 14] # 使用 for loop 搭配 flat 將矩陣的每一個元素逐一印出 for item in a.flat: print(item) ''' 3 4 5 6 7 8 9 10 11 12 13 14 '''

numpy array 的 merge (合併)

  • 使用 vertical stack : vstack 垂直合併兩個 array
    # coding=utf-8 import numpy as np A = np.array([1,1,1]) B = np.array([2,2,2]) # vertical stack 垂直方向 上下合併 C = np.vstack((A,B)) print(A.shape) # (3,) print(B.shape) # (3,) print(C.shape) # (2, 3) print(C) ''' [[1 1 1] [2 2 2]] '''
  • 使用 horizontal stack : hstack 水平合併兩個 array
    # coding=utf-8 import numpy as np A = np.array([1,1,1]) B = np.array([2,2,2]) # horizontal stack 水平方向 左右合併 D = np.hstack((A,B)) print(D.shape) # (6,) print(D) # [1 1 1 2 2 2]
  • 使用 newaxis 做 array 的轉置與合併應用
    # coding=utf-8 import numpy as np A = np.array([1,1,1]) print(A) # [1 1 1] print(A.transpose()) # [1,1,1] 無法使用 transpose 把一個橫向的數列變成縱向的數列 # 要做到這件事,要使用 new axis 增加維度 # 在 row 上面增加維度 print(A[np.newaxis,:].shape) # (1, 3) print(A[np.newaxis,:]) # [[1 1 1]] # 在 col 上面增加維度 print(A[:,np.newaxis].shape) # (3, 1) print(A[:,np.newaxis]) ''' [[1] [1] [1]] ''' # 應用:把兩個橫向的陣列,轉為縱向的,然後合併 A = np.array([1,1,1])[:,np.newaxis] # 橫向陣列 轉 縱向矩陣 B = np.array([2,2,2])[:,np.newaxis] # 橫向陣列 轉 縱向矩陣 C = np.vstack((A,B)) # 垂直合併 D = np.hstack((A,B)) # 水平合併 print(A.shape) # (3,1) print(B.shape) # (3,1) print(C.shape) # (6,1) print(C) ''' [[1] [1] [1] [2] [2] [2]] ''' print(D.shape) # (3,2) print(D) ''' [[1 2] [1 2] [1 2]] '''
    補充說明:陣列與矩陣轉換
    # coding=utf-8 import numpy as np A = np.array([1,1,1]) B = np.array([2,2,2]) print(A.shape) # (3,) print(A) # [1 1 1] print(B.shape) # (3,) print(B) # [2 2 2] A = np.array([1,1,1])[np.newaxis,:] # 橫向陣列 轉 橫向矩陣 B = np.array([2,2,2])[np.newaxis,:] # 橫向陣列 轉 橫向矩陣 print(A.shape) # (1,3) print(A) # [[1 1 1]] print(B.shape) # (1,3) print(B) # [[2 2 2]]
  • 使用 concatenate 做多個 Array 合併
    # coding=utf-8 import numpy as np A = np.array([1,1,1]) B = np.array([2,2,2]) # 使用 concatenate 進行合併 E = np.concatenate((A,B,B,A)) print(E) # [1 1 1 2 2 2 2 2 2 1 1 1] F = np.concatenate((A,B,B,A), axis=0) # 合併 print(F) # [1 1 1 2 2 2 2 2 2 1 1 1]

numpy array 分割

  • 使用 split 做等量分割
    #coding=utf-8 import numpy as np A = np.arange(12).reshape(3,4) print(A) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' # 縱向分割 split(輸入矩陣, 要分割的數量, axis=1 就是對 col 方向的分割) print(np.split(A, 2, axis=1)) ''' [array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])] ''' # 橫向分割 split(輸入矩陣, 要分割的數量, axis=0 就是 row 方向的分割) print(np.split(A, 3, axis=0)) ''' [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] '''
  • 使用 array_split 做不等量分割
    #coding=utf-8 import numpy as np A = np.arange(12).reshape(3,4) print(A) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' # p.s. split 分割只能分成等量分割,例如 3x4 col 方向的只能分成 2份 4份 不可分成 3份 # 所以下面這行會報錯 print(np.split(A, 3, axis=1)) # ValueError: array split does not result in an equal division # 如果要做不等量的分割的話要使用 array_split() print(np.array_split(A, 3, axis=1)) ''' col 分成了 2,1,1 這樣的份數 [array([[0, 1], [4, 5], [8, 9]]), array([[ 2], [ 6], [10]]), array([[ 3], [ 7], [11]])] '''
  • 使用 vsplit 與 hsplit 分割
    #coding=utf-8 import numpy as np A = np.arange(12).reshape(3,4) print(A) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' # 使用 verticle split (vsplit) 來做 axis=0 方向分割 print(np.vsplit(A, 3)) ''' [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])] ''' # 使用 horizontal split (hsplit) 來做 axis=1 方向分割 print(np.hsplit(A, 2)) ''' [array([[0, 1], [4, 5], [8, 9]]), array([[ 2, 3], [ 6, 7], [10, 11]])] '''

numpy array 複製 copy 與 deep copy

  • copy by assignment
    #coding=utf-8 import numpy as np a = np.arange(4) print(a) # [0 1 2 3] b = a c = a d = b a[0] = 11 # 修改 a print(b) # [11 1 2 3] 也會動到 b print(b is a) # True 因為 b = a 時 b 就是 a print(c) # [11 1 2 3] 同理 c 也會變 print(d) # [11 1 2 3] 因為 d 就是 b, b 就是 a ,所以改 a 也會動到 d d[1:3]=[22,33] # 所以修改 d 也會動到其他三個變數 print(a) # [11 22 33 3] print(b) # [11 22 33 3] print(c) # [11 22 33 3]
  • deep copy
    #coding=utf-8 import numpy as np # 如果只想修改 a 但是不想要動用到其他人,那就要使用所謂的 deep copy a = np.arange(4) b = a.copy() # deep copy print(a) # [0 1 2 3] print(b) # [0 1 2 3] a[3] = 44 print(a) # [ 0 1 2 44] print(b) # [0 1 2 3]

留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking