2193
7178
我有几秒钟的时间列表,例如:
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不同。
你该怎么做? 
我认为您的意思是基于“对于从第二个边界开始的每个长度为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