如何通过Numpythonic方式从sliding_window_view生成的滑窗数组还原原始数组?
如何通过Numpythonic方式从sliding_window_view生成的滑窗数组还原原始数组?
嘿,这个问题我之前也折腾过,其实还原起来没那么复杂,分两种情况给你说清楚:
一、针对步长为1的场景(你的案例正好是这种)
从你的输出能看出来,滑窗是每次右移1位生成的(sliding_window_view默认步长就是1),这种情况还原超级直接:
每个batch里的原始序列,前win_len(窗口长度,这里是3)个元素就是第一个滑窗,剩下的元素就是从第二个滑窗开始,每个滑窗的最后一个元素,把这两部分拼起来就搞定了!
给你写个可直接运行的代码示例:
import numpy as np from numpy.lib.stride_tricks import sliding_window_view # 先重现你的输入数据 test = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14]).reshape(-1,7) # 形状(2,7) slided = sliding_window_view(test, window_shape=(3,), axis=-1).copy() # 开始还原原始数组 win_len = slided.shape[-1] # 拼接:第一个滑窗 + 后续所有滑窗的最后一个元素 reconstructed = np.concatenate([slided[:, 0, :], slided[:, 1:, -1]], axis=-1) print("还原后的数组:") print(reconstructed) print("还原后的形状:", reconstructed.shape)
运行后输出会和你原始的test完全一致,形状也回到了(2,7)。
二、通用情况(步长不为1时)
如果你的滑窗步长不是1,就需要用加权求和的方式还原:先计算每个原始元素在滑窗中出现的次数,再把滑窗元素按位置累加后除以出现次数。举个步长为2的例子:
import numpy as np from numpy.lib.stride_tricks import sliding_window_view # 步长为2的滑窗示例 test = np.array([1,2,3,4,5,6,7]).reshape(1,-1) slided = sliding_window_view(test, window_shape=3, axis=-1, step=2).copy() # slided形状为(1,3,3):[[[1,2,3], [3,4,5], [5,6,7]]] win_len = slided.shape[-1] num_win = slided.shape[1] step = 2 seq_len = (num_win - 1) * step + win_len # 计算原始序列长度 # 构造权重数组:记录每个原始元素在滑窗中出现的次数 weights = np.zeros(seq_len, dtype=int) for i in range(num_win): start = i * step end = start + win_len weights[start:end] += 1 # 累加滑窗元素并还原 reconstructed = np.zeros_like(test) np.add.at(reconstructed[0], np.arange(seq_len).repeat(weights), slided.flatten()) reconstructed = reconstructed // weights print("步长2时的还原结果:", reconstructed)
回到你的问题,第一种方法最简洁高效,完全符合Numpythonic的风格~
备注:内容来源于stack exchange,提问作者Muhammad Ikhwan Perwira
相关产品推荐
相关产品推荐

