python-3.x - 如何对超出范围的连接值使用 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 的输入值。为什么会发生这种情况以及如何解决它?
解决方案
np.digizize
具有不同的编号而不是np.histogram
表示边界之外的值:
从文档:
如果 x 中的值超出 bin 的范围,则根据需要返回 0 或 len(bins)。
您的情况下的索引 12 表示一个值高于给定的限制。如果您想要最后一个 bin,这意味着在您的情况下为索引 11。索引为 0 的第一个 bin 是低于下边界的值,索引 1 是第一个有效 bin。
推荐阅读
- html - 从 Outlook 发送到 gmail 的 HTML 电子邮件签名增加了额外的空间
- javascript - ASP。NET CORE - Identity _LoginPartial.cshtml 如何使用来自 javascript 的函数
- react-native - 如何使用带有 React Native 的 Redux Toolkit Query 在手机重启或应用关闭之后持久化缓存数据?
- typescript - 打字稿既不是,也不是,但不是两个属性
- c# - AppBarToggleButton 第三状态的 UWP 编辑样式
- sql - 如何在 ORDER BY 和 LIMIT 之后获得一列的总和?
- android - 如何以编程方式在 Android 中将 .mid 转换为 .wav 文件?
- javascript - 本地存储错误,纠正的最佳方法?
- arduino - 从 Arduino IDE 上传 ESP8266 失败
- python - 如何为嵌套分类变量设置 x_range 或缩放级别以解决重叠问题