如何在 Python 中找到数字附近的一组数字的最大值?



我知道这个问题令人困惑,但让我解释一下。我有分贝和频率阵列,我想找到某些频率附近的最大dB。例如,我正在寻找接近 100 Hz +/-.05 Hz(99.5-100.5 Hz 频段(的最大 Db。阵列包含大量数据,覆盖 0-1000 Hz。我正在尝试在几个频率位置找到此信息。

我尝试使用list.index和numpy.where在我感兴趣的位置附近形成一个较小的数据点数组。然后我可以使用 max(( 来查找我需要的值。我要么错误地接近这种方法和/或这种方法的运行时间太长。有没有更有效的方法?

有序频率

如果频率列表已排序,则可以使用平分库在列表中有效地查找给定频率的索引。然后,您可以使用分贝列表中的相同索引来选取相应的分贝值。

frequency_list = [...]
decibel_list = [...]
f = 100
i = bisect.bisect_left(frequency_list, f)
db = decibel_list[i]

即使frequency_list不包含f,您也会得到一个有效的索引。

您可以使用此原理从频率范围中提取值样本。

假设您的范围是[f1, f2],其中f1= f - .5 和f2=f+ .5

您可以尝试:

i1 = bisect.bisect_left(frequency_list, f1)
i2 = bisect.bisect_left(frequency_list, f2)
sample = decibel_list[i1:i2]
db = max(sample)

无序频率

如果频率列表是无序的,则不能使用以前的解决方案。 另一种解决方案是在每个频率和每个分贝之间创建映射。 然后,您可以从此映射中提取样本并取最大值:

mapping = {f: db for f, db in zip(frequency_list, decibel_list)}
f1 = 100 - 0.5
f2 = 100 + 0.5
sample = [db for f, db in mapping.items() if f1 <= f <= f2]
db = max(sample)

像这样的东西?

def maxValueNear(numbers, target, tolerance):
maxVal = numbers[0]
for value in numbers:
if(target - tolerance <= value and value <= target + tolerance):
if(value > maxVal):
maxVal = value    
return maxVal

根据最大值检查值,仅拾取范围内的元素(目标公差、目标+公差(

假设你有两个对应的数组

(1(freq_array和db_array

(2(两个数组有对应的索引

def find_max(db_array, freq_array, start_freq, end_freq, default_val = 0):
" Finds max in db_array between start_freq & end_freq"
# Uses a generator
# default_val returned by max when no values in frequency range
return max((x for i, x in enumerate(db_array) if start_freq <= freq_array[i] <= end_freq), default=default_val)

示例用法

# Search from 99.5 to 100.5 Hz with a default of 0
peak = find_max(db_array, freq_array, 99.5, 100.5)
#>>> max value or 0.0 (if no values in range)
# Search from 99.5 to 100.5 Hz with a default of negative infinity
peak = find_max(db_array, freq_array, 99.5, 100.5, float("-inf"))
# max value or -inf (if no values in range)

相关内容

最新更新