229
17581
我有幾秒鐘的時間列表,例如:
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)<= at:
result.append([])
result [at] .append(data [data_idx])
#遍歷輸入數據
而data_idx  a:
如果x  = l [0])&(L  = i)&(L