QQ:3020889729 小蔡
特別聲明
這是一個簡單的學生成績問題,以促進對numpy的認識、理解和運用。
本練習採用jupyter notebook運行,所以,如果是採用其它如pycharm的ide,需要將上一個任務需要的數據進行剪切才能正常運行。
jupyter notebook可以從上而下依次運行。
練習內容
- lambda關鍵字
- np.random.randint生成隨機整數
- np.random.rand生成隨機0~1的數
- np.round四捨五入保留小數位
- np.unique元素去重
- np.max取最大值
- narray.tolist(),np的narray對象轉list數據對象
- np.mean取平均值
- np.flip反轉數組
- np.sum求和
- plt.bar繪製條形圖
- plt.pie繪製餅圖
練習任務
目標 | 任務內容 |
---|---|
任務一 | 獲取所有學生成績中,每一科目中出現過的分數(因爲可能有分數相同,但是隻出一次),每一科目的單科成績排名以及最高分 |
3.任務二 | 每個學生的平均分排名以及獲取平均分最高分學生序號——學生平均分成績排名 |
4.任務三 | 繪製20個同學的平均成績條形圖 |
4.任務四 | 計算及格率,以及繪製及格所佔的餅狀圖 |
開始練習
導入必要的庫
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 設置繪圖字體
matplotlib.rcParams['axes.unicode_minus'] = False # 設置符號(負號的正常顯示)
數據準備
1.隨機生成20個學生的成績:每個學生成績包含語、數、外、物、化、生、體的成績。
# 成績:20*7
students_num = 20 # 學生人數
course_num = 7 # 成績科目數
# 成績組成:int + float(保留1位小數)
student_scores_int = np.random.randint(40, 100, (20, 7)) # 成績組成,整數部分
student_scores_float = np.random.rand(20, 7) # 成績組成,小數部分
student_scores = np.round(student_scores_int + student_scores_float, 1) # np.round 保留一位小數
print("生成的學生成績表(20*7)如下:\n\n", student_scores)
結果展示:(由於是隨機數參數,所以每一次運行出來的成績可能不相同)
任務一
2.任務一:獲取所有學生成績中,每一科目中出現過的分數(因爲可能有分數相同,但是隻出一次),每一科目的單科成績排名以及最高分
# 獲取每一個科目出現過的分數(使用np.unique)
course_lib_get = lambda x, y: x[:, y]
course_name = ['Chinese', 'Math', 'English', 'Biologic', 'Chemistry', 'Physics', 'Sports'] # 字典列表
course_scores_dict = {course_name[x]:[] for x in range(7)} # 存儲每一科的成績
course_first = {course_name[x]:[] for x in range(7)} # 存儲每一科的最好成績
for i in range(len(student_scores[1,:])): # len對於維度的長度計算,默認是axis==0的軸,也可以通過切片等操作實現更進一維長度的計算
course_scores = course_lib_get(student_scores, i) # 依次獲取科目的成績
course_scores = np.unique(course_scores) # 去掉每一科中重複出現的分數(np.unique,處理一維去重自動排序)
course_scores_dict[course_name[i]] = course_scores.tolist() # 以字典方式存儲,tolist()轉換爲字典
course_first[course_name[i]] = np.max(course_scores).tolist() # 以字典方式存儲每一科的最高分
print("科目最高分:\n{0}\n\n".format(course_first))
print("\n本次考試每一科出現過的成績:")
for n in course_scores_dict: # 遍歷字典的key
print("{0}:\n {1}\n".format(n, course_scores_dict[n]))
結果展示:
任務二
3.任務二:每個學生的平均分排名以及獲取平均分最高分學生序號——學生平均分成績排名
# 獲取每個學生的平均分排名以及每一科目的單科成績排名——並獲取相應學生的序號
students_mean = np.mean(student_scores, axis=1).round(1) # 以行計算平均,保留1位小數
# students_mean
student_mean_index = {students_mean[x]:x for x in range(20)} # 爲平均分打上所屬編號:學生編號
student_mean_rank = {student_mean_index[x]:x for x in np.flip(np.sort(students_mean))} # 獲取平均分排名
print("學生平均分成績排名:")
rank_index = 1
for x in student_mean_rank:
print('第{0}名:[{1}: {2}]'.format(rank_index, x, student_mean_rank[x]))
rank_index += 1
結果展示:
任務三
4.任務三:繪製20個同學的平均成績條形圖
bar_height = students_mean.tolist() # 獲取平均成績的list
x_label = [i for i in range(0, 200, 10)] # 配置條形圖的位置參數(以及條形間隔)
Total_mean = np.sum(students_mean)/20 # 總學生平均成績
Total_mean_bar_height = [Total_mean for i in range(20)] # 擴展總學生平均成績爲list
rects1 = plt.bar(x=x_label, height=bar_height, width=2, alpha=0.4, color='red', label="實際平均成績") # 繪製每個學生實際平均成績的bar,返回句柄
rects2 = plt.bar(x=[x + 2 for x in x_label], height=Total_mean_bar_height, width=2, alpha=0.4, color='blue', label="總的平均成績{0}".format(np.round(Total_mean, 1)))
for rect in rects1: # 繪製bar上的文本
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom") # 在對應句柄下的bar上繪製文本str(height)
plt.xticks([index + 0.2 for index in x_label], [i for i in range(20)]) # 設置x軸值
plt.xlabel("學生序號") # xlabel設置
plt.legend() # 題注顯示
plt.title("20個同學的平均成績") # 標題
結果展示:(圖像似乎有點小,但是整體上不影響我們的練習)
任務四
5.任務四:計算及格率,以及繪製及格所佔的餅狀圖
pass_rate = int(len(students_mean[students_mean>=60])/len(students_mean) * 100) # 及格百分比
fail_rate = 100 - pass_rate # 不及格百分比
plt.pie(x=(pass_rate, fail_rate), # 餅圖中需要繪製的數據
labels=('pass_rate', 'fail_rate'), # 數據對應的標籤
explode=[0,1], # 凸顯部分——需要將第三個數據部分凸顯,且整個繪圖數據包含5個數據,那麼就傳入[0,0,1,0,0],對應位設置位非零
colors=('pink', 'magenta'), # 配置繪圖可選顏色
autopct='%.0f%%', # 數據顯示形式(不設置不顯示數據,僅有圖形劃分)
radius=2.8, # 餅圖半徑
labeldistance=1.2, # 標籤與圓心的距離
wedgeprops={'linewidth':4,'edgecolor':'yellow'}, # 餅圖邊界設置:linewidth邊界線寬度, edgecolor邊界顏色
textprops= {'fontsize':20,'color':'black'}) # 顯示字體設置:fontsize大小, color顏色
結果展示:
練習總結
numpy基本講解到這裏就結束了,基本的語法規則,如np對象的概念,np數組的組成以及數據類型,還有np函數,廣播規則等。
至於np中一些數學運算公式(如積分,平方等)和運算公式的應用將在另一個板塊中展開。
接下來的板塊將從matplotlib和numpy的數學公式運用展開。
大致模式如下:
- matplotlib繪圖講解。
- numpy在數學上的運算,實現數學公式的代碼實現和基礎語法的鞏固。
- 完善補充板塊練習內容。
往期回顧
用實踐帶領你進入numpy的世界——(一):numpy的效率和基本屬性
用實踐帶領你進入numpy的世界——(二):numpy基本數組創建函數
用實踐帶領你進入numpy的世界——(三):numpy基本運算講解
用實踐帶領你進入numpy的世界——(四):numpy基本函數運算(sum,mean……)
用實踐帶領你進入numpy的世界——(五):numpy廣播運算講解(加法爲例)
numpy知道多少?感知篇——numpy的屬性