我有两个列表,第一个代表观察时间,第二个代表那些时间的观察值。我试图找到给定的各种长度的滚动窗口的最大观测值和相应的时间。例如,这是两个列表。
# 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
via模块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.2
是max linspeed
对应于重复的,time_count 8.0
并且400.9
是max linspeed
对应于重复的time_count 10.0
,这意味着将删除重复的time_counts的剩余索引处的其他线性速度。
我不确定还能尝试什么。我如何才能适应这种情况(或找到一种新方法),以有效的方式找到与重复值相对应的所有索引?任何意见,将不胜感激。(PS-我将numpy标记为标签,因为我认为还有一种方法可以通过numpy来实现,而我还没有想到。)
无需详细介绍如何实施和高效滚动窗口最大值过滤器;减少重复值可以看作是一个分组问题,numpy_indexed包(免责声明:我是它的作者)为以下问题提供了有效而简单的解决方案:
import numpy_indexed as npi
unique_time, unique_speed = npi.group_by(time_count).max(linspeed)
对于大型输入数据集(即重要的地方),这应该比任何非矢量化解决方案都要快得多。内存消耗是线性的,并且性能通常为NlogN。但是由于time_count似乎已经进行了排序,因此性能也应该是线性的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句