0

0

NumPy数组非重叠滑动窗口的高效构建方法

碧海醫心

碧海醫心

发布时间:2025-09-12 14:07:01

|

680人浏览过

|

来源于php中文网

原创

NumPy数组非重叠滑动窗口的高效构建方法

本文深入探讨了在NumPy中创建非重叠滑动窗口的多种高效方法,包括利用reshape进行简单重塑、结合sliding_window_view进行切片,以及通过理解as_strided的原理进行底层操作。通过详细的代码示例和原理分析,旨在帮助读者根据具体需求选择最合适的策略,从而优化数据处理流程。

在数据分析和机器学习任务中,将一维数组分割成固定大小的、互不重叠的子数组(即非重叠滑动窗口)是一项常见操作,尤其是在时间序列分析或异常检测等领域。numpy库提供了多种灵活且高效的方式来实现这一目标。本文将详细介绍三种主要方法:简单的reshape、结合sliding_window_view进行切片,以及更底层的as_strided。

1. 利用 reshape 进行简单重塑

当原始数组的长度能够被窗口大小完美整除时,reshape方法是最直接、最简洁的解决方案。它将一维数组直接重塑为二维数组,其中每个行代表一个非重叠的窗口。

示例代码:

import numpy as np

# 原始一维数组
x = np.arange(1, 7)
print(f"原始数组: {x}")

# 窗口大小为3,数组长度可被3整除
window_size = 3
if len(x) % window_size == 0:
    result_reshape = x.reshape(-1, window_size)
    print(f"使用 reshape 创建的非重叠窗口:\n{result_reshape}")
else:
    print("数组长度无法被窗口大小整除,reshape不适用。")

输出:

原始数组: [1 2 3 4 5 6]
使用 reshape 创建的非重叠窗口:
[[1 2 3]
 [4 5 6]]

注意事项:reshape方法要求数组的元素总数必须与新形状的元素总数相匹配。如果无法完美整除,此方法将报错。

2. 结合 sliding_window_view 进行切片

np.lib.stride_tricks.sliding_window_view 是NumPy提供的一个强大工具,用于创建滑动窗口视图。默认情况下,它会生成所有可能的、高度重叠的滑动窗口。为了获得非重叠窗口,我们可以在其输出结果上进行步长切片。

示例代码:

import numpy as np

x = np.arange(1, 7)
window_size = 3

# 1. 生成所有重叠的滑动窗口
all_windows = np.lib.stride_tricks.sliding_window_view(x, window_size)
print(f"使用 sliding_window_view 生成的重叠窗口:\n{all_windows}")

# 2. 从重叠窗口中切片出非重叠部分
# 每隔 window_size 个窗口取一个,即可实现非重叠
non_overlapping_windows = all_windows[::window_size]
print(f"通过切片获得的非重叠窗口:\n{non_overlapping_windows}")

输出:

使用 sliding_window_view 生成的重叠窗口:
[[1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]]
通过切片获得的非重叠窗口:
[[1 2 3]
 [4 5 6]]

优点:

  • sliding_window_view 封装了复杂的步幅计算,使用起来更直观。
  • 即使数组长度不能被窗口大小完美整除,它也能生成所有可能的窗口,之后可以灵活地进行切片处理。

3. 利用 as_strided 进行底层控制

np.lib.stride_tricks.as_strided 是NumPy中实现视图操作的底层函数。它允许用户直接指定新数组的形状(shape)和步幅(strides),从而创建任意复杂的视图。理解strides是使用as_strided的关键。

理解 strides:strides是一个元组,表示在每个维度上移动一个元素需要跳过的字节数。

  • 对于一个NumPy数组 arr,arr.strides 会返回其步幅。
  • 例如,一个 int32 类型的数组,如果 arr.strides 是 (4,),表示在第一个维度上移动一个元素需要跳过4个字节(即一个 int32 元素的大小)。

为了创建非重叠窗口,我们需要计算正确的shape和strides。

计算 shape 和 strides: 假设我们有一个一维数组 x,元素类型为 dtype,窗口大小为 window_size。

  • 新数组的行数 (窗口数量): num_windows = len(x) // window_size

    Figma
    Figma

    Figma 是一款基于云端的 UI 设计工具,可以在线进行产品原型、设计、评审、交付等工作。

    下载
  • 新数组的列数 (窗口大小): window_size

  • 因此,新数组的 shape 为: (num_windows, window_size)

  • 原始数组的元素字节大小: itemsize = x.itemsize (例如,np.int32 为 4 字节)

  • 新数组第一个维度(行)的步幅: 要从一个窗口的起始位置跳到下一个非重叠窗口的起始位置,需要跳过 window_size 个原始数组元素。所以步幅是 window_size * itemsize。

  • 新数组第二个维度(列)的步幅: 在一个窗口内部,要从一个元素跳到下一个元素,只需跳过一个原始数组元素。所以步幅是 itemsize。

  • 因此,新数组的 strides 为: (window_size * itemsize, itemsize)

示例代码:

import numpy as np

x = np.arange(1, 7)
window_size = 3

# 获取原始数组的元素字节大小
item_size = x.itemsize
print(f"原始数组元素字节大小: {item_size}") # 例如,int32是4字节

# 计算新数组的 shape
num_windows = len(x) // window_size
new_shape = (num_windows, window_size)

# 计算新数组的 strides
# 行步幅: 从一个窗口的开头到下一个窗口的开头,跳过 window_size 个元素
row_stride = window_size * item_size
# 列步幅: 在一个窗口内,从一个元素到下一个元素,跳过 1 个元素
col_stride = item_size
new_strides = (row_stride, col_stride)

print(f"计算出的新 shape: {new_shape}")
print(f"计算出的新 strides: {new_strides}")

# 使用 as_strided 创建非重叠窗口视图
non_overlapping_as_strided = np.lib.stride_tricks.as_strided(x, shape=new_shape, strides=new_strides)
print(f"使用 as_strided 创建的非重叠窗口:\n{non_overlapping_as_strided}")

# 比较 as_strided 和 sliding_window_view 默认行为的 strides
# full_overlap_strides = np.lib.stride_tricks.as_strided(x, shape=(len(x) - window_size + 1, window_size), strides=(item_size, item_size))
# print(f"等价于 sliding_window_view 默认行为的 as_strided (重叠):\n{full_overlap_strides}")

输出:

原始数组元素字节大小: 4
计算出的新 shape: (2, 3)
计算出的新 strides: (12, 4)
使用 as_strided 创建的非重叠窗口:
[[1 2 3]
 [4 5 6]]

注意事项:

  • as_strided非常强大,但也伴随着风险。如果shape或strides计算错误,可能会导致访问到数组边界之外的内存,引发段错误或返回不确定的值。
  • 它创建的是一个视图,而不是数据的副本。这意味着修改视图会同时修改原始数组。
  • 通常情况下,如果reshape或sliding_window_view能满足需求,优先使用它们,因为它们更安全、更易于理解。

总结

下表总结了三种方法的特点:

方法 优点 缺点 适用场景
reshape 最简洁、高效 严格要求数组长度能被窗口大小整除 数组长度可完美整除,追求代码简洁
sliding_window_view + 切片 灵活,封装了步幅计算,易于理解 需额外切片步骤,可能先生成大量中间窗口 数组长度不确定,或需要更灵活的窗口处理
as_strided 极致的灵活性和性能,底层控制 复杂,易出错,需手动计算步幅,存在内存安全风险 对性能有极高要求,或需实现非常规的视图操作

在大多数实际应用中,推荐优先考虑使用 reshape(如果适用)或 sliding_window_view 结合切片的方法。as_strided 虽功能强大,但其复杂性和潜在风险使其更适合对NumPy内部机制有深入理解的高级用户,或在性能成为瓶颈且其他方法无法满足需求时使用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

138

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

122

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Excel 教程
Excel 教程

共162课时 | 13.7万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号