使用NumPy进行数字分箱遇异常:目标区间0.1-1.0却得到1-10结果
问题分析
你当前的代码问题在于:lables_train是0-9的整数,远大于分箱边界[0.1,0.2,...,0.9],除了0会被分到第0组,1-9都会被分到第9组(因为np.digitize默认right=False,大于最后一个边界值的元素会返回边界数组的长度)。你说结果是1-10,大概率是后续对结果做了+1操作,但无论如何,这都不符合你按[0.1,0.2,...,1.0]分箱的预期——本质是你没有将原始的0-9数据归一化到0-1区间,导致数据和分箱边界不匹配。
解决方案
要实现将0-9的数组按[0.1,0.2,...,1.0]的逻辑分箱,需要先将数据归一化到0-1区间,再设置正确的分箱边界:
- 归一化原始数据:把0-9的整数映射到0-1范围
- 设置分箱边界:用
0.1,0.2,...,0.9作为边界,这样会生成10个分箱区间,正好对应你要的0.1到1.0的划分
示例代码:
import numpy as np # 假设你的原始数据 lables_train = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 步骤1:归一化到0-1区间 normalized_labels = lables_train / 9.0 # 0→0,9→1 # 步骤2:设置分箱边界 bins = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) # 执行分箱 digitalized_labels = np.digitize(normalized_labels, bins) # 查看结果 print(digitalized_labels) # 输出:[0 1 2 3 4 5 6 7 8 9]
如果希望分箱结果从1开始(而非0),可以直接加1:
digitalized_labels = np.digitize(normalized_labels, bins) + 1 # 输出:[1 2 3 4 5 6 7 8 9 10]
补充说明
np.digitize的核心规则(默认right=False):
- 对于每个元素x,返回第一个满足
bins[i] > x的索引i - 若x ≤ bins[0],返回0;若x > bins[-1],返回
len(bins) - 如果你需要左闭右开的区间(比如
[0.1,0.2)),可以设置right=True,此时规则变为返回第一个满足bins[i] ≥ x的索引i
内容的提问来源于stack exchange,提问作者Tim Bretschneider
相关产品推荐
相关产品推荐

