代替做網(wǎng)站推廣鄭州seo顧問外包公司
文章目錄
文章目錄
- 00 寫在前面
- 01 基于Python版本的滑動(dòng)窗口代碼
- 02 算法效果
00 寫在前面
寫這個(gè)算法原因是:訓(xùn)練了一個(gè)時(shí)序網(wǎng)絡(luò),該網(wǎng)絡(luò)模型的時(shí)序維度為32,而測試數(shù)據(jù)的時(shí)序維度為90。因此需要采用滑動(dòng)窗口的方法,生成一系列32維度的窗口,用于測試。
該算法中用到了一個(gè)python的關(guān)鍵字yield,其用于定義生成器函數(shù)。生成器函數(shù)與普通函數(shù)不同,它可以在執(zhí)行過程中暫停,并在以后繼續(xù)從暫停的地方恢復(fù)執(zhí)行。每次調(diào)用生成器函數(shù)時(shí),都會(huì)返回一個(gè)生成器對象,而不是直接返回一個(gè)值。在你的代碼中,yield 用于產(chǎn)生一個(gè)滑動(dòng)窗口。
01 基于Python版本的滑動(dòng)窗口代碼
def window(seq, size=3, stride=2):"""返回一個(gè)滑動(dòng)窗口(寬度為'size')在數(shù)據(jù)序列'seq'上,具有指定的'stride'。例如,seq -> (s0, s1, ..., s[size-1]), (s[stride], s[stride+1], ..., s[stride+size-1]), ..."""it = iter(seq) # 從輸入序列創(chuàng)建一個(gè)迭代器result = [] # 初始化一個(gè)空列表來存儲(chǔ)當(dāng)前窗口# 遍歷迭代器中的每個(gè)元素for elem in it:result.append(elem) # 將當(dāng)前元素添加到窗口中if len(result) == size: # 如果窗口達(dá)到所需大小yield result # 生成當(dāng)前窗口result = result[stride:] # 根據(jù)步幅長度滑動(dòng)窗口# 如果主循環(huán)后結(jié)果列表中還有剩余元素if result:i = 0 # 初始化一個(gè)計(jì)數(shù)器來填充剩余窗口while len(result) < size: # 當(dāng)窗口小于所需大小時(shí)result.append(seq[i % len(seq)]) # 從序列開始添加元素i += 1 # 增加計(jì)數(shù)器yield result # 生成最終窗口
02 算法效果
# 示例使用
seq = [1, 2, 3, 4, 5, 6, 7, 8]
for windowed in window(seq, size=3, stride=2):print(windowed) # 打印每個(gè)滑動(dòng)窗口初始狀態(tài):result = []
添加元素:result = [1, 2, 3] 生成窗口 [1, 2, 3],重置 result = [3]
添加元素:result = [3, 4, 5] 生成窗口 [3, 4, 5],重置 result = [5]
添加元素:result = [5, 6, 7] 生成窗口 [5, 6, 7],重置 result = [7]
添加元素:result = [7, 8]
填充元素:result = [7, 8, 1],生成最后一個(gè)窗口 [7, 8, 1]