我有幾秒鐘的時間列表,例如: 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:18
我認為您的意思是基於“對於從第二個邊界開始的每個長度為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