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

如何在Python中找到一组接近某个数字的数字的最大值?,python,indexing,max,where-clause,Python,Indexing,Max,Where Clause,我知道这个问题令人困惑,但让我解释一下。我有分贝和频率数组,我想找到某些频率附近的最大分贝。例如,我正在寻找100 Hz+/-.05 Hz(99.5-100.5 Hz的频带)附近的最大Db。阵列包含大量数据,覆盖0-1000 Hz。我试图在几个频率位置找到这些信息 我尝试使用list.index和numpy.where在我感兴趣的地方附近形成一个较小的数据点数组。然后我可以使用max()来找到我需要的值。我的方法不正确和/或此方法的运行时间太长。有没有更有效的方法 像这样的 def maxVal

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

我尝试使用list.index和numpy.where在我感兴趣的地方附近形成一个较小的数据点数组。然后我可以使用max()来找到我需要的值。我的方法不正确和/或此方法的运行时间太长。有没有更有效的方法

像这样的

def maxValueNear(数字、目标、公差):
maxVal=数字[0]
对于数值:

假设有两个对应的数组,if(target-tolerance)

(1) 一个freq_数组和一个db_数组

(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)

订购频率

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

frequency\u list=[…]
分贝列表=[…]
f=100
i=对分。左对分(频率列表,f)
db=分贝列表[i]
即使frequency_列表不包含f,也会得到一个有效的索引

可以使用此原则提取值的样本​​从一个频率范围

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

您可以尝试:

i1=bisect.bisect\u left(频率列表,f1)
i2=对分。左对分(频率列表,f2)
样本=分贝列表[i1:i2]
db=最大值(样本)
无序频率

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

mapping={f:db for f,db in zip(频率列表,分贝列表)}
f1=100-0.5
f2=100+0.5

sample=[db for f,db in mapping.items(),如果f1是指您有两个对应的数组——一个freq_数组和一个db_数组,并且您希望根据开始/停止频率搜索范围在db_数组中查找最大值?您能给我们一段数据吗?
# 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)