Я пытаюсь использовать digitize
через модуль numpy
для поддержки дневника. Идея состоит в том, чтобы ввести общее количество баллов, заработанных учеником в классе, так, чтобы результат соответствовал буквенному баллу. Моя попытка ниже:
import numpy as np
from collections import OrderedDict
## letter grades and points at cusps of letter grades
letter_grades = np.array(['F', 'D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A'])
point_edges = np.concatenate(np.linspace(101, 153, len(letter_grades)), 10**3)
point_edges[0] = 0
## each letter grade corresponds to point values within the two corresponding point edges
edge_pairs = np.array([('{} - {}'.format(point_edges[idx-1], point_edges[idx])) for idx in range(1, len(point_edges))])
criteria = OrderedDict(zip(letter_grades, edge_pairs))
# print(criteria)
## sample data (the top one works, the one below throws an error)
# point_scores = (0, 100, 100.9, 101, 101.1, 136)
point_scores = (0, 100, 100.9, 101, 101.1, 136, 146, 150, 152, 153, 154)
## use numpy to get result
indices = np.digitize(point_scores, point_edges)
final_grades = letter_grades[indices]
for point, grade in zip(point_scores, final_grades):
print("\n .. {} POINTS :: {}\n".format(point, grade))
Запуск вышеуказанного кода выдает следующую ошибку:
IndexError: index 12 is out of bounds for axis 1 with size 12
Я сделал 1000
последним элементом point_edges
, так что любые входные значения больше 153 будут выводить 'A'
(как видно из оператора print(criteria)
, закомментированного выше. Однако алгоритм работает только для входных значений строго меньше 153. Почему это происходит и как я могу это исправить?