1.假设有一张成绩表记录了10名学生的语文、数学、英语、生物、历史这5门课的成绩,成绩范围均为50~100分。10名学生的学号分别为100、101、102、103、104、105、106、107、108、109。利用numpy完成一下操作: (1)使用随机数模拟学生成绩,并存储在数组中。 (2)查询学号为105的学生的英语成绩。 (3)查询学号为100、102、105、109的4位学生的语文、数学和英语成绩。 (4)查询大于或等于90分的成绩和相应学生的学号。 (5)按各门课程的成绩排序。 (6)按每名学生的成绩排序。 (7)计算每门课程的平均分、最高分和最低分。 (8)计算每名学生的最高分、最低分。 (9)查询最低分及相应的学生学号和课程。 (10)查询最高分及相应的学生学号和课程。 (11)语文、数学、英语、生物、历史这5门课程在总分中的占比分别为25%、25%、20%、15%、15%。如果总分位100分,则计算每名学生的总成绩。 (12)查询最高的3个总分。
时间: 2023-07-10 21:10:53 浏览: 78
学科、姓名、分数。 分别计算每门学科分数最高的前三名,并显示名次。写入MySQL中。
这里提供一个基于Python和NumPy的示例代码,实现上述操作:
```python
import numpy as np
# 定义学生学号和课程名称
students = ['100', '101', '102', '103', '104', '105', '106', '107', '108', '109']
subjects = ['语文', '数学', '英语', '生物', '历史']
# 使用随机数生成成绩表
np.random.seed(0) # 设置随机数种子
grades = np.random.randint(50, 101, size=(10, 5)) # 10名学生,5门课程
print("成绩表:")
print(grades)
# 查询学号为105的学生的英语成绩
print("学号为105的学生的英语成绩:")
print(grades[5, 2]) # 注意索引从0开始,所以第6名学生对应索引为5,英语课程对应索引为2
# 查询学号为100、102、105、109的4位学生的语文、数学和英语成绩
selected_students = [0, 2, 5, 9] # 学号对应的索引
selected_subjects = [0, 1, 2] # 语文、数学、英语对应的索引
print("学号为100、102、105、109的学生的语文、数学和英语成绩:")
print(grades[selected_students][:, selected_subjects])
# 查询大于或等于90分的成绩和相应学生的学号
print("大于或等于90分的成绩和相应学生的学号:")
mask = grades >= 90
indices = np.argwhere(mask) # 找到满足条件的元素的索引
print(np.column_stack((students[indices[:, 0]], subjects[indices[:, 1]], grades[indices])))
# 按各门课程的成绩排序
print("按各门课程的成绩排序:")
sorted_indices = np.argsort(grades, axis=0)[::-1] # 从大到小排序并翻转
for i, subject in enumerate(subjects):
print(subject)
print(np.column_stack((np.array(students)[sorted_indices[:, i]], grades[sorted_indices[:, i], i])))
# 按每名学生的成绩排序
print("按每名学生的成绩排序:")
sorted_indices = np.argsort(grades.sum(axis=1))[::-1] # 按总成绩从大到小排序并翻转
for i, student in enumerate(np.array(students)[sorted_indices]):
print(student)
print(np.column_stack((subjects, grades[sorted_indices[i]])))
# 计算每门课程的平均分、最高分和最低分
print("每门课程的平均分、最高分和最低分:")
for i, subject in enumerate(subjects):
print(subject)
print("平均分:", np.mean(grades[:, i]))
print("最高分:", np.max(grades[:, i]))
print("最低分:", np.min(grades[:, i]))
# 计算每名学生的最高分、最低分
print("每名学生的最高分、最低分:")
print("最高分:", np.max(grades, axis=1))
print("最低分:", np.min(grades, axis=1))
# 查询最低分及相应的学生学号和课程
min_index = np.argmin(grades)
print("最低分:", grades[min_index])
print("学生学号:", students[min_index // 5])
print("课程:", subjects[min_index % 5])
# 查询最高分及相应的学生学号和课程
max_index = np.argmax(grades)
print("最高分:", grades[max_index])
print("学生学号:", students[max_index // 5])
print("课程:", subjects[max_index % 5])
# 计算每名学生的总成绩
weights = np.array([0.25, 0.25, 0.2, 0.15, 0.15]) # 各门课程的权重
total_scores = np.sum(grades * weights, axis=1)
print("每名学生的总成绩:")
print(np.column_stack((students, total_scores)))
# 查询最高的3个总分
top_indices = np.argsort(total_scores)[::-1][:3] # 总成绩从大到小排序并选取前3个
print("最高的3个总分:")
print(np.column_stack((np.array(students)[top_indices], total_scores[top_indices])))
```
说明:
- 这里使用了 NumPy 的数组操作,可以方便地完成多维数组的操作和计算。
- 为了方便操作,我们将学生学号和课程名称都存储在了列表中,并使用索引来访问。
- 注意在 NumPy 中,索引从0开始,所以实际上第6名学生对应索引为5,英语课程对应索引为2。
- 在查询部分,我们使用了布尔掩码和 `argwhere()` 函数来找到满足条件的元素的索引。
- 在排序部分,我们使用了 `argsort()` 函数来排序,并使用切片来翻转数组,实现从大到小排序。
- 在计算部分,我们使用了 NumPy 的聚合函数来计算平均值、最大值、最小值等统计量。
阅读全文