如何从两个列表中删除与单独列表的重复值相对应的非最大值索引?

2024-02-24

我有两个列表,第一个列表代表观察时间,第二个列表代表这些时间的观察值。我试图在给定不同长度的滚动窗口的情况下找到最大观测值和相应的时间。例如,这是两个列表。

# observed values
linspeed = [280.0, 275.0, 300.0, 475.2, 360.1, 400.9, 215.3, 323.8, 289.7]

# times that correspond to observed values
time_count = [4.0, 6.0, 8.0, 8.0, 10.0, 10.0, 10.0, 14.0, 16.0]

# actual dataset is of size ~ 11,000

缺失时间(例如:3.0)对应于观测值为零,而重复时间对应于对下限时间的多个观测值。因为我的窗户将滚过time_count(例如:前 2 小时、接下来 2 小时、之后 2 小时的最大值;前 4 小时、接下来 4 小时的最大值,...),我计划使用数组重塑例程。然而,重要的是之前正确设置所有内容,这需要找到给定重复次数的最大值。为了解决这个问题,我尝试了下面的代码。

def list_duplicates(data_list):
    seen = set()
    seen_add = seen.add
    seen_twice = set(x for x in data_list if x in seen or seen_add(x))
    return list(seen_twice)

# check for duplicate values
dups = list_duplicates(time_count)
print(dups)
>> [8.0, 10.0]

# get index of duplicates
for dup in dups:
    print(time_count.index(dup))
>> 2
>> 4

在检查重复项的索引时,此代码似乎只会返回重复值第一次出现的索引。我也尝试过使用OrderedDict通过模块collections出于代码效率/速度的原因,但字典也有类似的问题。给定非重复观察值的重复键,重复键的第一个实例和相应的观察值将被保留,而所有其他实例将从字典中删除。每这个帖子 https://stackoverflow.com/questions/176918/finding-the-index-of-an-item-given-a-list-containing-it-in-python?rq=1,我的第二次尝试就在下面。

for dup in dups:
    indexes = [i for i,x in enumerate(time_count) if x == dup]
print(indexes)
>> [4, 5, 6] # indices correspond to duplicate time 10s but not duplicate time 8s

我应该得到[2,3] for time in time_count = 8.0 and [4,5,6] for time in time_count = 10.0。从重复的 time_counts 中,475.2 is the max linspeed对应于重复项time_count 8.0 and 400.9 is the max linspeed对应于重复项time_count 10.0,这意味着重复 time_counts 的剩余索引处的其他 linspeeds 将被删除。

我不确定我还能尝试什么。我怎样才能适应这个(或找到一种新方法)以有效的方式找到与重复值相对应的所有索引?任何意见,将不胜感激。 (PS - 我将 numpy 设置为标签,因为我认为有一种方法可以通过 numpy 来做到这一点,但我还没有弄清楚。)


不深入讨论如何实现高效的滚动窗口最大过滤器的细节;减少重复值可以看作是一个分组问题,numpy_索引 https://github.com/EelcoHoogendoorn/Numpy_arraysetops_EP包(免责声明:我是它的作者)提供了高效且简单的解决方案:

import numpy_indexed as npi
unique_time, unique_speed = npi.group_by(time_count).max(linspeed)

对于大型输入数据集(即重要的地方),这应该比任何非矢量化解决方案快得多。内存消耗呈线性,性能一般为NlogN;但由于 time_count 似乎已经排序,性能也应该是线性的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从两个列表中删除与单独列表的重复值相对应的非最大值索引? 的相关文章