Как использовать цифровую цифру для объединенных значений, выходящих за пределы диапазона? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь использовать 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. Почему это происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 27 апреля 2018

np.digizize имеет нумерацию, отличную от np.histogram, для обозначения значений, выходящих за границы:

Из документов :

Если значения в x выходят за границы бинов, 0 или len (бины) возвращается в случае необходимости.

Индекс 12 в вашем случае указывает на то, что значение превышает заданные пределы. Если вы хотите последний контейнер, это означает индекс 11 в вашем случае. Первый бин с индексом 0 - это значения ниже нижней границы, индекс 1 - первый допустимый бин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...