Python讀書會 — 公開課程讀書會筆記 — NumPy Array 數組切割 — NumPy copy & deep copy 帶大家了解使用=賦值和使用copy的差別在哪
Github連結
哈囉,大家好!!由於小弟最近接到擔任舉辦讀書會的講師,而這個讀書會是根據莫凡Python公開課程所開設的,大家希望我可以帶他們看過莫凡Python的相關系列課程,所以讀書會這個系列主要是根據莫凡Python的公開系列課程講解和筆記,當然我也會額外找尋資料並補充給大家,也因為是根據公開課程的筆記,所以我都會明確記錄出處,如果有違反作者權力,麻煩告知,我會在第一時間立即刪除這系列的文章,感謝大家,當然也要特別感謝莫凡Python這麼厲害的公開課程,讓大家可以無痛初探Python的魔法世界!!
我是跟其他優秀的講師一起開設莫凡Python讀書會的,所以我不會每個章節都有筆記喔XD!!
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