logo
Loading...

NumPy的Array分割 和 NumPy的copy與deep copy - 莫凡 Python 基礎研習讀書會 - Cupoy

1. NumPy Array 數組切割 課程資料來源: 9 numpy的 array分割 (教学教程) 創建數組 import numpy as np ​ ## 創建數組 A = np.arang...

1. NumPy Array 數組切割 課程資料來源: 9 numpy的 array分割 (教学教程) 創建數組 import numpy as np ​ ## 創建數組 A = np.arange(20).reshape((5,4)) print(A) 執行結果 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] 等量縱向切割 - np.split ## 縱向分割 - 切割成兩段 print(np.split(A, 2, axis = 1)) 執行結果 [array([[ 0, 1],   [ 4, 5],   [ 8, 9],   [12, 13],   [16, 17]]), array([[ 2, 3],   [ 6, 7],   [10, 11],   [14, 15],   [18, 19]])] 等量橫向切割 - np.split ## 橫向切割 - 切成五段 print(np.split(A, 5, axis = 0)) 執行結果 [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]]), array([[16, 17, 18, 19]])] 等量切割報錯狀況 ## 當遇到不等量的切割時會報錯 print(np.split(A, 2, axis = 0)) ## 因為5沒辦法等量切割成兩段 執行結果 ValueError: array split does not result in an equal division 報錯原因: 因為5沒辦法等量切割成兩段 不等量切割 - array_split print(A) ​ ## 不等量的切割 print(np.array_split(A, 2, axis = 1)) 執行結果 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] [array([[ 0, 1],   [ 4, 5],   [ 8, 9],   [12, 13],   [16, 17]]), array([[ 2, 3],   [ 6, 7],   [10, 11],   [14, 15],   [18, 19]])] 更多切割方法 - np.hsplit、np.vsplit print(A) ​ ## 水平切割 等同於np.split(A, 5, axis = 0) print(np.hsplit(A, 2)) ​ ## 垂直切割 等同於np.split(A, 2, axis = 1) print(np.vsplit(A, 5)) 執行結果 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] [array([[ 0, 1],   [ 4, 5],   [ 8, 9],   [12, 13],   [16, 17]]), array([[ 2, 3],   [ 6, 7],   [10, 11],   [14, 15],   [18, 19]])] [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]]), array([[16, 17, 18, 19]])] 2. NumPy copy & deep copy 講解 課程資料來源: 10 numpy的 copy & deep copy (教学教程) 創建數組 import numpy as np ​ a = np.arange(6) print(a) 執行結果 [0 1 2 3 4 5] 使用 = 來創建一樣的數組 ## 賦值 b = a c = a d = b print(a, b, c, d) 執行結果 [0 1 2 3 4 5] [0 1 2 3 4 5] [0 1 2 3 4 5] [0 1 2 3 4 5] 更改A的時候會同時影響所有用=創建的數組 ## 當改變a的時候,b、c、d都會跟著改變 a[0] = 11 print(a, b, c, d) ​ ## 判斷b、c、d是否與a一樣 print(b is a) print(c == a) print(d is a) 執行結果 [11 1 2 3 4 5] [11 1 2 3 4 5] [11 1 2 3 4 5] [11 1 2 3 4 5] True [ True True True True True True] True 更改D也同時會影響A、B、C ## 更改d值,a、b、c也會更著改變 d[2:5] = [6,6,6] print(a, b, c, d) 執行結果 [11 1 6 6 6 5] [11 1 6 6 6 5] [11 1 6 6 6 5] [11 1 6 6 6 5] 使用copy來構建複本,當A更改後就不會影響COPY所創建出來的複本 ## 使用copy創建a的複本e,改變a的時候就不會影響b e = a.copy() print(e) a[1] = 100 print(a) print(e) print(a is e) 執行結果 [ 11 100 6 6 6 5] [ 11 100 6 6 6 5] [ 11 100 6 6 6 5] False