用實踐帶領你進入numpy的世界——(六):numpy綜合小練習①

                         QQ:3020889729                                                                                 小蔡

特別聲明

這是一個簡單的學生成績問題,以促進對numpy的認識、理解和運用。
本練習採用jupyter notebook運行,所以,如果是採用其它如pycharm的ide,需要將上一個任務需要的數據進行剪切才能正常運行。
jupyter notebook可以從上而下依次運行

練習內容

  1. lambda關鍵字
  2. np.random.randint生成隨機整數
  3. np.random.rand生成隨機0~1的數
  4. np.round四捨五入保留小數位
  5. np.unique元素去重
  6. np.max取最大值
  7. narray.tolist(),np的narray對象轉list數據對象
  8. np.mean取平均值
  9. np.flip反轉數組
  10. np.sum求和
  11. plt.bar繪製條形圖
  12. 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的數學公式
運用展開。
大致模式如下:

  1. matplotlib繪圖講解。
  2. numpy在數學上的運算,實現數學公式的代碼實現和基礎語法的鞏固。
  3. 完善補充板塊練習內容。

往期回顧

用實踐帶領你進入numpy的世界——(一):numpy的效率和基本屬性
用實踐帶領你進入numpy的世界——(二):numpy基本數組創建函數
用實踐帶領你進入numpy的世界——(三):numpy基本運算講解
用實踐帶領你進入numpy的世界——(四):numpy基本函數運算(sum,mean……)
用實踐帶領你進入numpy的世界——(五):numpy廣播運算講解(加法爲例)
numpy知道多少?感知篇——numpy的屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章