如何优化区间观测值占比计算函数?无需手动指定上界包含性
优化方案与简化实现
首先指出原函数的两处问题:
- 代码存在变量名错误:
assessment1marks应替换为参数observations,否则运行会抛出未定义变量的错误。 include_upper参数冗余,需要手动指定的逻辑不符合你想要的自动化区间判断需求。
以下是针对你的需求给出的几种简洁高效的实现方式:
方式一:单区间自动处理,无需手动指定上界包含逻辑
默认遵循「左闭右开」规则,若传入的上界是观测值的最大值,则自动包含该值,完美匹配你说的「除最后一个区间外,上界归入下一个区间」的场景:
import numpy as np def compute_interval_proportion(observations, lower_bound, upper_bound): """ 计算观测值在指定区间内的占比 规则:默认左闭右开;若upper_bound为观测值最大值,自动转为包含上界 """ max_val = np.max(observations) include_upper = upper_bound == max_val # 合并条件判断,避免重复代码 mask = (observations >= lower_bound) & ( observations <= upper_bound if include_upper else observations < upper_bound ) # 用np.mean直接计算占比,比手动统计长度更高效 proportion = round(np.mean(mask), 3) return proportion
方式二:多区间批量统计(更贴合实际业务场景)
如果你的需求是批量统计多个区间的占比(比如同时统计0-50、50-70、70-100的分数占比),可以用numpy.digitize自动处理区间划分,完全无需手动干预上界逻辑:
import numpy as np def compute_multi_interval_proportions(observations, bins): """ 批量计算多组区间的占比,默认左闭右开,最后一个区间自动包含上界 参数bins:区间分界点列表,例如[0,50,70,100]对应区间[0,50)、[50,70)、[70,100] """ # digitize自动返回每个元素所属的区间索引,默认左闭右开规则 indices = np.digitize(observations, bins, right=False) # 统计每个区间的元素数量,过滤掉超出分界点的异常值 counts = np.bincount(indices, minlength=len(bins))[1:-1] proportions = np.round(counts / len(observations), 3) # 生成可读性强的区间标签,返回键值对结果 interval_labels = [ f"[{bins[i]}, {bins[i+1]}{']' if i == len(bins)-2 else ')'}" for i in range(len(bins)-1) ] return dict(zip(interval_labels, proportions))
使用示例
scores = np.array([45, 60, 70, 85, 95, 50, 69, 71, 100]) print(compute_multi_interval_proportions(scores, [0,50,70,100])) # 输出:{'[0, 50)': 0.222, '[50, 70)': 0.222, '[70, 100]': 0.556}
额外优化提示
- 原函数中用
np.where获取索引再统计长度的方式,不如直接使用布尔数组的sum()或np.mean()高效,numpy的向量化操作比索引遍历性能提升明显。 - 可以添加输入验证逻辑,比如检查
lower_bound <= upper_bound,避免传入无效参数导致错误。
内容的提问来源于stack exchange,提问作者Dan Öz
相关产品推荐
相关产品推荐

