我有一个元组列表,即2-dim元组,其值为x和y。称之为数据。我想取两个浮点数xmin和xmax,并返回该时间间隔内最大y值的索引。 即使xmin和xmax与数据点不完全匹配,它也应该工作。
我理解如何解决问题,除了将xmin和xmax舍入到列表中最接近的值的方法。我不知道我是一个蟒蛇新手。
# Find the index of the point (x, y) with the maximum y value
# on the interval [xmin, xmax]
def find_peak(data, xmin, xmax):
暂时,我可以搜索列表并记录每个x值的最小差异。这是可行的还是有更聪明的方法?
答案 0 :(得分:1)
给出2维坐标列表。
min
的内置operator.itemgetter(1)
来查找x_main和x_max中具有最大y值的元素示例实施
def foo(data, x_min, x_max):
from bisect import bisect_left, bisect
from operator import itemgetter
data = sorted(data)
x_data = [x for x,y in data]
index_min = bisect_left(x_data, x_min)
index_max = bisect(x_data, x_max)
return max(data[index_min:index_max],key=itemgetter(1))[-1]
运行示例
>>> data = [(random.randint(1,20),random.randint(1,20)) for _ in range(10)]
>>> data
[(9, 9), (11, 11), (7, 7), (16, 11), (15, 19), (8, 18), (16, 3), (18, 7), (17, 13), (3, 11)]
>>> foo(data,3,7)
11
答案 1 :(得分:1)
max_finder = lambda point: point[1] if x_min <= point[0] <= x_max else float("-inf")
# get data point of target element
max_y = max(data, key=max_finder)
# gets index of target element
max_y_idx = max(enumerate(data), key=lambda x: max_finder(x[1]))[0]
# or alternatively, after finding max_y
max_y_idx = data.index(max_y_idx)
请注意,这应该略微优于排序变体,因为max
具有O(n)复杂度,index
具有O(n)最坏情况复杂度,与O(n * log(n))相比排序复杂性。