将数字与数字比较交错在一起



我有2个Python整数列表。 列表的大小可能不同。 一个是数据集中所有最大值的索引列表,另一个是所有最小值的索引列表。我想按顺序列出连续的最大值和最小值,并跳过 2 个最大值之间有 2 分钟的情况。

速度最重要,所以我问如何最快速地完成以下工作(使用 Numpy,我假设,一个答案(:下面的 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_idxmax_idx之间来回跳跃,以描绘"下一个最大的数字":

  1. 从 1 开始min_idx
  2. 查看max_idx以找到第一个大于 1:2 的未使用数字
  3. 返回min_idx查找第一个大于 2 的未使用数字:5
  4. 再次为max_idx:我们跳过 4,因为它小于 5 并选择 6
  5. 继续处理,直到我们用完任一列表中的值。

再举一个例子,对于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 函数可以找到数据集的最大值和最小值,并返回指示交替最大值最小值的索引列表,那也将解决我正在寻找的问题。

这是一个更简单的逻辑,不使用 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]

最新更新