因此,我们的任务是创建一个函数,获取输入成绩~(一个 N ×M 矩阵,其中包含在 M 个不同作业中给予 N 个学生的 7 级评分。),并计算 GradesFinal(一个向量长度 n 包含 N 个学生中每个学生的最终成绩。)。
对于每个学生,最终成绩必须按以下方式计算:
如果只有一项作业 (M = 1),则最终成绩等于该作业的成绩。
如果有两个或多个作业 (M > 1),则丢弃最低成绩。最终成绩的计算方式为 M − 1 个最高成绩的平均值,四舍五入到 等级上最接近的等级(使用函数 roundGrade)。
无论上述情况如何,如果学生在一项或多项作业中获得 -3 分,则最终成绩必须始终为 -3。
我已在下面插入了 roundGrade 函数,但是当我尝试运行矩阵时,我收到了。 “类型错误:/不支持的操作数类型:'NoneType' 和 'int'
”。这意味着我可能完全误解了某些东西。
import numpy as np
def computeFinalGrades(grades):
if len(grades)==1:
gradesFinal = grades
elif len(grades)>=2:
trimmed = grades.remove(min(grades))
finalgrade = np.mean(trimmed)
gradesFinal = roundGrade(finalgrade)
elif grades[grades==-3]:
gradesFinal= -3
return gradesFinal
def roundGrade(grades):
grade_groups = [-3,0,2,4,7,10,12]
gradesRounded = [min(grade_groups,key=lambda x:abs(grade-x)) for grade in grades]
return gradesRounded
感谢您的帮助,并欢迎向我展示更聪明的方法。
最佳答案
这是一个直接作用于NxM
二维数组的解决方案,而不是单独作用于每个向量,所以我假设M对于所有学生都是相同的,并且设置了缺失值(作业)到nan
。 G
也可以只是 1d,这意味着每个学生只有 1 份作业。
def grades(G):
import numpy
# return G directly if there is only 1 assignment (M=1)
if len(G.shape) == 1 or G.shape[1] == 1:
return G[:]
# sort for easier calculation of mean
SG = numpy.sort(G)
# set all values to -3 if a -3 is found on any assignment of that student
m3 = numpy.where(SG==-3)[0]
SG[m3] = -3
levels = numpy.array((-3, 0, 2, 4, 7, 10, 12))
# take the mean of all assigments except the worst (index=0 of each student)
MG = numpy.nanmean(SG[:,1:], axis=-1)
# find the nearest grade in the list of levels, rounding down if two are equally close
diffs = numpy.abs(MG[:,None] - levels)
index = numpy.nanargmin(diffs, axis=-1)
return levels[index]
关于python - 如何从矩阵中的行中删除最小值 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884383/