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

用户名

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

# 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

当检查重复项的索引时,似乎此代码将仅返回第一次出现重复值的索引。由于代码效率/速度方面的原因,我也尝试使用OrderedDictvia模块collections,但是字典也有类似的问题。给定用于非重复观察值的重复键,将保留重复键的第一个实例和相应的观察值,同时从dict中删除所有其他键。根据这篇SO帖子,我的第二次尝试就在下面。

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]time in time_count = 8.0[4,5,6]time in time_count = 10.0从重复的time_counts中,475.2max linspeed对应于重复的,time_count 8.0并且400.9max linspeed对应于重复的time_count 10.0,这意味着将删除重复的time_counts的剩余索引处的其他线性速度。

我不确定还能尝试什么。我如何才能适应这种情况(或找到一种新方法),以有效的方式找到与重复值相对应的所有索引?任何意见,将不胜感激。(PS-我将numpy标记为标签,因为我认为还有一种方法可以通过numpy来实现,而我还没有想到。)

Eelco Hoogendoorn

无需详细介绍如何实施和高效滚动窗口最大值过滤器;减少重复值可以看作是一个分组问题,numpy_indexed包(免责声明:我是它的作者)为以下问题提供了有效而简单的解决方案:

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

对于大型输入数据集(即重要的地方),这应该比任何非矢量化解决方案都要快得多。内存消耗是线性的,并且性能通常为NlogN。但是由于time_count似乎已经进行了排序,因此性能也应该是线性的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个列表及其索引之间的最大值

列表中两个切片的最小最大值/最大值

如何使用理解过滤Erlang中两个列表的最大值?

在两个列表之间排序最大值

根据最大值删除元组列表中的重复项

删除R中两个向量的最大值

提取列表中n个最大值的索引

根据第二个索引的最大值删除列表中的元组

如何在与一个变量中的最大值相对应的所有变量中找到最大值?

结合LISP中的两个函数来原子化列表然后找到最大值?

列表最大值的索引

给定两个长度相同的二进制列表,如何找到与交替列表中的索引相对应的所有索引对,中间没有索引?

如何在单行数据框中获取与n个最大值相对应的列?

在Perl中,如何找到列表中的最小值并保持索引与该值相对应?

如何汇总一列中两个单独列的最小值和最大值

在列表字典中获取与最大值对应的键

根据两个索引中任一索引的值从两个列表中删除项目

如何在多层groupby中划分熊猫中两个单独的df列的最大值?

Python:比较两个列表,并用符号获取最大值和最小值

从两个不同列表中的 dict 中删除重复键/值的更多 Pythonic 方法

如何从列表中的每个元素都是元组的列表中获取元组第 0 个索引处的最大值?

Python:如何遍历列表以找到另一个列表中索引为正值的最大值

获取两个最大值的索引

在三个骰子列表中滚动两个骰子时找到最大值

如何将数字值转换为在数组中具有单独值的数组,其中列表中索引的最大值将为1

如何从两个列表中删除重复的元素(成对)?

Java。如何从两个列表中删除重复的对象

将列表的两个索引值连接成 python 列表中的单个索引值

从python中的两个列表中删除通用值