将带有标记的数组转换为带有字母标记的数组 numpy

Convert an array with marks into an array with letter marks numpy

这里我尝试return一个字母等级数组,但是return只有一个字母等级。 我需要在字母级 numpy 数组中获取整个 numz 数组。 我用了一个for循环,但是因为第一个元素完成了,就没有再继续了。

import numpy as np
from scipy import stats

marks = np.array([90,72,82,90,69,19,23,30,45,5])

#Average of the array
avg = np.average(marks)


mdn = np.median(marks)

stand_dev = np.std(marks)

rang = np.ptp(marks)

mode = stats.mode(marks)

mode = mode[0]

# the loop that turns marks into letter Grade array
def letterGrade(mark):
    for i in range (len(mark)):
        list_new = []
        score = mark[i]
        if  score <= avg:
            return "F"
        elif (( score > avg) & ( score <= mdn)):
            return "D"
        elif (( score > mdn) & (score <= stand_dev)):
            return "C"
        elif (( score > stand_dev) & ( score <= rang)):
            return "B"
        elif (( score > rang) & ( score <= mode)):
            return "A"
        elif score > mode:
            return "A+"
    
    list_new.append(score)

letterGrade(marks)

这可以用digitize优雅地解决:

letters = np.array(['F', 'D', 'C', 'B', 'A', 'A+'])
bins = [avg, mdn, avg+stand_dev, rang, mode[0], 100]
letters[np.digitize(marks, bins, True)].tolist()

结果

['A', 'C', 'C', 'A', 'C', 'F', 'F', 'F', 'F', 'F']

(请注意,我将 stand_dev 替换为 avg+stand_dev,这样才有意义)