大家好,歡迎來到數據新手村的第十四天,也是「NumPy 深度探索週」的最後一天!在過去的一週裡,我們學習了 NumPy 的核心 ndarray
物件、各種創建方法、索引技巧、向量化運算以及豐富的內建函式。
今天不做過多的理論介紹,而是要將前面所學融會貫通,透過解決幾個真實世界的小問題,來一場結業式的實戰演練!
將使用 NumPy 來解決幾個常見的數據分析問題。請打開 PyCharm,跟著我一起動手吧!
某城市一週的最高溫為
[28, 30, 29, 31, 32, 30, 29]
度。
- 計算平均氣溫、最高氣溫和最低氣溫。
- 找出氣溫超過 30 度的天數。
import numpy as np
temps = np.array([28,30,29,31,32,30,29])
print(temps)
print('平均氣溫:', '%.3f'%np.mean(temps))
print('最高氣溫:',np.max(temps))
print('最低氣溫:',np.min(temps))
print('氣溫超過30的天數:', len(temps[temps>30]))
# 其他解法
# print('氣溫超過30的天數:', temps[temps>30].size)
# print('氣溫超過30的天數:', np.sum(temps>30))
# print('氣溫超過30的天數:', np.cumsum(np.where(temps>30, 1, 0))[-1])
# print('氣溫超過30的天數:', np.sum(np.where(temps>30, 1, 0)))
# print('氣溫超過30的天數:', np.count_nonzero(temps>30))
輸出結果:
[28 30 29 31 32 30 29]
平均氣溫: 29.857
最高氣溫: 32
最低氣溫: 28
氣溫超過30的天數: 2
題目二:學生成績統計
某班級5名學生的數學成績為 [85, 90, 78, 92, 88]。
- 計算成績的平均分數、中位數和標準差。
- 將成績轉換為十分制(假設滿分為 10)。
score = np.array([85,90,78,92,88])
print(score)
print(np.sort(score))
print("5名學生的平均分:", np.mean(score))
print("5名學生的中位數:", np.median(score))
print("5名學生的變異數:", np.var(score))
print("5名學生的標準差:%.3f"% np.std(score))
print("5名學生的成績:", score / 10)
輸出結果:
[85 90 78 92 88]
[78 85 88 90 92]
5名學生的平均分: 86.6
5名學生的中位數: 88.0
5名學生的標準差: 23.84
5名學生的方差:4.883
5名學生的成績: [8.5 9. 7.8 9.2 8.8]
題目三:矩陣運算
給定矩陣A=[[1, 2],[3, 4]]和B=[[5, 6],[7, 8]]。
- 計算 A+B 和 A*B (逐元素乘法)。
- 計算 A 和 B 的矩陣乘法 (點積)。
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
print(A)
print(B)
print(A + B)
print(A * B)
# print(A @ B)
print(np.dot(A,B))
輸出結果:
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[ 6 8]
[10 12]]
[[ 5 12]
[21 32]]
[[19 22]
[43 50]]
[[19 22]
[43 50]]
題目四:隨機資料生成與替換
產生一個 3x4 的隨機整數陣列,範圍在 [0, 10) 之間。
- 計算每列 (column) 的最大值和每行 (row) 的最小值。
- 將陣列中的所有奇數替換為 -1。
np.random.seed(0)
arr = np.random.randint(0,10, [3,4])
print(arr)
print("每列的最大值:", np.max(arr, axis=0)) # 列:axis=0, 行:axis=1
print("每行的最小值:", np.min(arr, axis=1))
# print("所有基數替換為-1:", np.where(arr%2 == 1, -1, arr))
arr[arr%2 == 1] = -1
print(arr)
輸出結果:
[[5 0 3 3]
[7 9 3 5]
[2 4 7 6]]
每列的最大值: [7 9 7 6]
每行的最小值: [0 3 2]
[[-1 0 -1 -1]
[-1 -1 -1 -1]
[ 2 4 -1 6]]
題目五:陣列拼接與變形
建立一個 1 到 12 的一維陣列,並轉換為(3,4)的二維陣列
- 計算每行的和與每列的平均值
- 將陣列展平為一維陣列
arr = np.arange(1, 13)
print(arr)
print(np.reshape(arr,(3,4)))
print("每行的和", np.sum(np.reshape(arr,(3,4)), axis=1))
print("每列的平均值", np.mean(np.reshape(arr,(3,4)), axis=0))
print(np.reshape(np.reshape(arr,(3,4)),(12)))
輸出結果:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
每行的和 [10 26 42]
每列的平均值 [5. 6. 7. 8.]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
題目六:布林索引
產生一個(5,5)的隨機數組,範圍 [0,20)
- 找出數組中大於 10 的元素
- 將所有大於 10 的元素替換為 0
np.random.seed(0)
arr = np.random.randint(0,20, [5,5])
print(arr)
print(arr[arr > 10])
print(np.where(arr > 10, 0, arr))
輸出結果:
[[12 15 0 3 3]
[ 7 9 19 18 4]
[ 6 12 1 6 7]
[14 17 5 13 8]
[ 9 19 16 19 5]]
[12 15 19 18 12 14 17 13 19 16 19]
[[0 0 0 3 3]
[7 9 0 0 4]
[6 0 1 6 7]
[0 0 5 0 8]
[9 0 0 0 5]]
結語:恭喜通關 NumPy 新手村!
經過這一週的學習與實踐,已經掌握了 NumPy 這個數據科學發動機的核心操作。從創建、檢視、索引、運算到實戰應用,已經具備了進行高效數值計算的基礎能力。
更重要的是,已經開始培養用「陣列化」和「向量化」的思維來解決問題,這將是未來學習更進階工具的關鍵。
我們的內功心法已經略有小成。從明天開始,Day 15,我們將拿起數據分析界最強大的瑞士刀——Pandas,正式向我們的 Olist 數據集發起總攻,開始真正的表格數據處理與分析!敬請期待!