我有几秒钟的时间列表,例如: L = [0.10218048,1.20851996,1.46800021,1.73429061,2.71525848, 3.14781922,3.63637958,5.11147358,5.97497864,6.35469013, 6.80623747、6.99951917、7.65215123、7.86108352、8.52988247, 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] 对于从第二个边界开始的每个长度为2秒的窗口,我想输出一个落在2秒窗口内的所有时间的列表。因此,对于上面的示例,它将是: [0.10218048,1.20851996,1.46800021,1.73429061] [1.20851996,1.46800021,1.73429061,2.71525848] [2.71525848、3.14781922、3.663637958] [3.14781922,3.63637958] [5.11147358,5.97497864] [5.11147358,5.97497864,6.35469013,6.80623747,6.99571917] [6.35469013,6.80623747,6.99571917,7.65215123,7.86108352] [7.65215123、7.86108352、8.52988247、8.83068894] [8.52988247,8.83068894] [10.07690977] [10.07690977,11.5386728] [11.5386728、12.01214112、12.13307653] [12.01214112,12.13307653] 通常,窗口长度可能与2不同。 你该怎么做?
2021-01-31 08:10:07
我认为您的意思是基于“对于从第二个边界开始的每个长度为2秒的窗口”的增量,并且不重叠。对于两秒钟的间隔,它是相同的,但是由于您要更改长度,因此一秒钟的重叠将是0-3、2-5、4-7,但是增量将表示0-3、1-4、2- 5,但是,为以防万一,找出解决方案很有趣。 假设L已排序且所有元素均为正,并且第二个间隔均以整数开头,则可以使用以下方法: 导入数学 从集合导入defaultdict L = [0.10218048,1.20851996,1.46800021,1.73429061,2.71525848, 3.14781922,3.63637958,5.11147358,5.97497864,6.35469013, 6.80623747、6.99951917、7.65215123、7.86108352、8.52988247, 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] my_ranges = defaultdict(列表) interval_width = 2 对于L中的x: upper_bound = math.ceil(x) lower_bound = upper_bound-interval_width lower_bound = max(0,lower_bound) 对于范围内的y(lower_bound,upper_bound): my_ranges [y] .append(x) 对于一个排序(my_ranges): 打印(my_ranges [a]) 我不知道您是否要查看是否有空范围。但是defaultdict也可以根据需要打印出空范围。使用此行,而不是“用于排序”: 对于范围(min(my_ranges),max(my_ranges)+1): 如果您希望范围为0-3、2-5、4-7,则可以这样做: 导入数学 从集合导入defaultdict L = [0.10218048,1.20851996,1.46800021,1.73429061,2.71525848, 3.14781922,3.63637958,5.11147358,5.97497864,6.35469013, 6.80623747、6.99951917、7.65215123、7.86108352、8.52988247, 8.83068894、10.07690977、11.53867284、12.01214112、12.13307653] interval_width = 2 my_ranges_2 = defaultdict(列表) 对于L中的x: absolute_in =(x //(interval_width-1))*(interval_width-1)#interval_width低于x的最低倍数将始终位于 #print(“ Adding”,x,“ to”,肯定是_in) my_ranges_2 [definitely_in] .append(x) 如果x= 0:例如,如果x为2.3并且我们有0,3 2,5等。。。我们需要捕捉这个重复的情况。我假设窗口长度是整数,如果不是,则还有很多事情要做,因为这个数字可能会包含多个数组。也许我们可以有一个while循环,以(interval_width-1)递增 #print(“ ++ Adding”,x,“ to”,肯定是-interval_width +1) my_ranges_2 [definitely_in-interval_width + 1]。附加(x) 进行排序(my_ranges_2): 打印(a,my_ranges_2 [a]) #打印(my_ranges_2 [a]) 我怀疑我忘记了一些细节,但是希望您可以根据需要旋转interval_width,以确保我的代码正在执行您希望的操作,并让我知道您真正需要什么。 | 从某种意义上说,我可以提出一个可能的解决方案是“有效的”,即仅对输入数据进行一次迭代并且没有依赖项。当然,代价是它是用纯Python编写的(可能会有更优化的代码),并且它引入了更多的跟踪变量以防止重复(因此Python的使用较少)。 def slide_window(数据,持续时间,开始= 0,重叠= 1): 结果= [] data_idx = 0 result_idx = 0 上限=开始+持续时间 较低=开始 next_lower =高-重叠 #内部助手将空的内部列表填充到我们的插入点并插入 def pad_and_append(at): 而len(result)<=位于: result.append([]) result [at] .append(data [data_idx]) #遍历输入数据 而data_idx a: 如果x = l [0])&(L = i)&(L