python - 使用数值比较快速交错 numpy 数组
问题描述
我有 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_idx
来max_idx
画出“下一个最大的数字”:
- 从 1 开始
min_idx
- 查看
max_idx
第一个大于 1 的未使用数字:2 - 返回
min_idx
找到第一个大于2的未使用数字:5 - 再次为
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 函数可以找到数据集的最大值和最小值,并返回指示交替最大值和最小值的索引列表,那将解决我的问题也在找。
解决方案
这是一个不使用 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]
推荐阅读
- flutter - 如何在 GridView.builder cads 中添加不同的信息?
- google-apps-script - 谷歌脚本在运行后删除列公式
- python - Openvino movidius 无法读取 IP 摄像头
- angular - (几乎)每个组件中的导航栏
- java - 在java中的另一个类中实例化后的println语句没有打印出正确的值
- github - 在 GitHub 上分叉后无法保存到我的存储库
- r - 使用 colname 向量将特定的 numeric/int 转换为 R 中的因子
- awesome-wm - 令人敬畏的 wm 视觉异常
- html - CSS使兄弟姐妹的孩子在100%宽度的父母中具有相同的宽度和高度(正方形)
- bash - AWS CLI - 尝试将命令的输出复制到文本文件