You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:14:31