首页 > 解决方案 > 如何对超出范围的连接值使用 numpy digitize?

问题描述

我正在尝试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 的输入值。为什么会发生这种情况以及如何解决它?

标签: python-3.xnumpyindexingvectorizationbinary-search

解决方案


np.digizize具有不同的编号而不是np.histogram表示边界之外的值:

文档

如果 x 中的值超出 bin 的范围,则根据需要返回 0 或 len(bins)。

您的情况下的索引 12 表示一个值高于给定的限制。如果您想要最后一个 bin,这意味着在您的情况下为索引 11。索引为 0 的第一个 bin 是低于下边界的值,索引 1 是第一个有效 bin。


推荐阅读