使用Numpy實現班級同學成績的統計
假設現在有如下的數據:
姓名/學科 | 語文 | 英語 | 數學 |
---|---|---|---|
張飛 | 66 | 65 | 30 |
關羽 | 95 | 85 | 98 |
趙雲 | 93 | 92 | 96 |
黃忠 | 90 | 88 | 77 |
典韋 | 80 | 90 | 90 |
- 統計全班的成績:在語文、數學、英語等中的平均成績、最小成績、最大成績、方差、標準差。然後將這些人的總成績排序輸出:
import numpy as np
# 1、先定義一個人物類
persontype = np.dtype({
'names':['name','chinese','english','math'],
'formats':['S32','i','i','i']
})
# 2、將數據加載
peoples = np.array([("ZhangFei",66,65,30),("GuanYu",95,85,98),
("ZhaoYun",93,92,96),("HuangZhong",90,88,77),
("DianWei",80,90,90)],dtype=persontype)
# 3、統計單科成績
chineses = peoples[:]['chinese']
englishs = peoples[:]['english']
maths = peoples[:]['math']
# 平均成績
print(np.mean(chineses))
print(np.mean(englishs))
print(np.mean(maths))
# 輸出最小值和最大值
print(np.amin(chineses))
print(np.amin(englishs))
print(np.amin(maths))
print(np.amax(chineses))
print(np.amax(englishs))
print(np.amax(maths))
# 計算方差和標準差
stdchinese = np.array(chineses)
print(np.std(stdchinese))
print(np.var(stdchinese))
stdenglish = np.array(englishs)
print(np.std(stdenglish))
print(np.var(stdenglish))
stdmath = np.array(maths)
print(np.std(stdmath))
print(np.var(stdmath))
# 排序
# ①所有成績
a = np.array([chineses,englishs,maths])
print(np.sort(a))
# ②按照三科成績之和降序排列
#用sorted函數進行排序
ranking = sorted(peoples,key=lambda x:x[1]+x[2]+x[3], reverse=True)
print(ranking)
注意:定義的結構數組中的S32代表的是什麼意思?
就是結構數組中:
persontype = np.dtype({
'names':['name','chinese','english','math'],
'formats':['S32','i','i','i']
})
實際上使用的是Numpy的字符編碼來表示數據類型的定義,比如i
代表的是整數,f
代表的是單精度浮點數,S
代表的是字符串,S32
代表的是32個字符的字符串。
參見下表:
數據類型 | 字符 |
---|---|
整數 | i |
單精度浮點數 | f |
雙精度浮點數 | d |
布爾值 | b |
字符串 | S(大寫) |
Unicode | U(大寫) |
假如數據中使用了中文,數學成績中含有單精度浮點數,可以把數據類型設置爲U32
,i
改成f
,如下代碼所示:
import numpy as np
persontype = np.dtype({
'names':['name','chinese','english','math'],
'formats':['U32','i','i','f']
})
peoples = np.array([("張飛",66,65,30.5),("關羽",95,85,98.5),
("趙雲",93,92,96.5),("黃忠",90,88,77),
("典韋",80,90,90.5)],dtype=persontype)