Python基于NumPy实现相邻边界区间数组值求和的函数修正
边界区间数值求和逻辑修正
偏差核心原因
np.digitize的默认分类会额外生成两个有效区间外的类别:所有小于最小边界值的元素归为0类,所有大于等于最大边界值的元素归为长度等于边界数组长度的类,这两个类别的求和值不属于目标计算范围np.bincount的输出长度由最大分类值决定,没有对齐相邻边界构成的固定区间数(排序后边界数组长度减1),导致输出长度、元素顺序不符合预期
修正实现
核心调整逻辑:
- 提前计算固定区间总数 = 排序后边界数组长度 - 1,保证输出长度严格匹配区间数量
- 过滤掉落在所有边界范围外的无效元素,仅保留落在相邻边界区间内的元素参与求和
- 将有效分类的索引偏移为从0开始的连续序列,通过
minlength参数强制bincount输出固定长度的结果,无匹配元素的区间自动补0
修正后的完整代码:
import numpy as np def formating(a, b): x = np.sort(b) n_intervals = len(x) - 1 l = np.digitize(a, x) # 筛选落在有效边界范围内的元素 valid_mask = (l >= 1) & (l <= len(x) - 1) valid_l = l[valid_mask] - 1 valid_weights = a[valid_mask] # 生成固定长度的加权求和结果 result = np.bincount(valid_l, weights=valid_weights, minlength=n_intervals) return result Numbers = np.array([3, 4, 5, 7, 8, 10,20]) limit1 = np.array([0, 2 , 5, 12, 15]) limit2 = np.array([0, 2 , 5, 12]) limit3 = np.array([0, 2 , 5, 12, 15, 22]) result1= formating(Numbers, limit1) result2= formating(Numbers, limit2) result3= formating(Numbers, limit3)
运行后输出完全匹配预期:
result1: [ 0. 7. 30. 0.] result2: [ 0. 7. 30. ] result3: [ 0. 7. 30. 0. 20.]
内容的提问来源于stack exchange,提问作者ege Selcuk
相关产品推荐
相关产品推荐

