我有2个Python整数列表。列表的大小可能不同。一个是数据集中所有最大值的索引列表,另一个是所有最小值的索引列表。我要按顺序列出连续的最大值和最小值,并跳过例如2分钟介于2个最大值之间的情况。
速度最重要,因此我想知道如何最快地完成以下操作(我假设使用Numpy,a la this answer):下面的numpy代码可以组成some_function()
来进行此计算?
>>> min_idx = [1,5,7]
>>> max_idx = [2,4,6,8]
>>> some_function(min_idx, max_idx)
[1, 2, 5, 6, 7, 8]
在上面的示例中,我们查看了哪个*_idx
列表以较低的值开头,并将其选择为“第一”(min_idx
)。从那里,我们在min_idx
和max_idx
之间来回跳动,以拍摄“下一个最大数字”:
min_idx
的1开始max_idx
来查找第一个未使用的大于1的数字min_idx
,查找第一个未使用的大于2的数字:max_idx
:我们跳过4,因为它小于5,所以选择了6 另一个示例,对于min_idx = [1,3,5,7,21]
和max_idx = [4,6,8,50]
,预期结果为[1,4,5,6,7,8,21,50]
我当前的非Numpy解决方案如下所示,其中idx
是输出:
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate(first_idx):
if not idx:
# We just started, so put our 1st value in idx
idx.append(v)
elif v > idx[-1]:
idx.append(v)
else:
# Go on to next value in first_idx until we're bigger than the last (max) value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate(second_idx[max_bookmark:]):
if k > v:
idx.append(k)
max_bookmark += j + 1
break
与其他有关合并Numpy数组的答案不同,这里的困难是沿两个列表之间的一跳比较元素值。
上述问题的2个输入列表由scipy.argrelextrema
生成,该列表必须使用两次:一次获取最大值的索引,再次获取最小值的索引。我最终只希望有一个交替的最大值和最小值的索引列表,因此,如果有一些scipy或numpy函数可以找到数据集的最大值和最小值,并返回指示交替的最大值和最小值的索引列表分钟,那也可以解决我在寻找什么。
答案 0 :(得分:0)
这是不使用Numpy的简单得多的逻辑(注意:这假设max(min_idx) < max(max_idx)
:
min_idx = [1,3,5,7,21]
max_idx = [4,6,8,50]
res = []
for i in min_idx:
if not res or i > res[-1]:
pair = min([m for m in max_idx if m > i])
res.extend([i, pair])
print(res)
>>> [1, 4, 5, 6, 7, 8, 21, 50]