如何找到阈值,使数组中大于它的元素数量匹配目标值?
寻找数组阈值:匹配目标元素数量的高效方案
给定一个数值数组和目标数量,需找到一个阈值,使得数组中大于该阈值的元素数量等于(或尽可能接近)目标值。
原方案的问题
原有的固定步长遍历方法存在效率低、精度不足的问题,示例代码如下:
import numpy as np arr = np.random.rand(100) target = 80 for i in range(100): t = i * 0.01 if (arr > t).sum() < target: break print(t)
该方法通过遍历固定步长的候选阈值,不仅遍历次数多、效率低下,而且步长直接限制了阈值的精度,无法得到更精确的结果。
高效优化方案
使用scipy.optimize.bisect(二分查找算法)可以高效且高精度地解决这个问题。二分查找通过不断缩小搜索区间,能在对数时间复杂度内定位到符合要求的阈值,精度可灵活调整。
示例代码:
import numpy as np from scipy.optimize import bisect arr = np.random.rand(100) target = 80 # 定义差值函数:返回当前阈值下,大于阈值的元素数与目标值的差值 def count_diff(threshold): return (arr > threshold).sum() - target # 设置二分查找的上下界:避免边界值问题,在数组极值外小幅扩展 search_low = arr.min() - 1e-9 search_high = arr.max() + 1e-9 # 执行二分查找 optimal_threshold = bisect(count_diff, search_low, search_high) print(f"最优阈值:{optimal_threshold}") print(f"大于该阈值的元素数量:{(arr > optimal_threshold).sum()}")
内容的提问来源于stack exchange,提问作者John Henckel
相关产品推荐
相关产品推荐

