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

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 = 3if 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 npx = 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

新数组的列数 (窗口大小): 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 npx = np.arange(1, 7)window_size = 3# 获取原始数组的元素字节大小item_size = x.itemsizeprint(f"原始数组元素字节大小: {item_size}") # 例如,int32是4字节# 计算新数组的 shapenum_windows = len(x) // window_sizenew_shape = (num_windows, window_size)# 计算新数组的 strides# 行步幅: 从一个窗口的开头到下一个窗口的开头,跳过 window_size 个元素row_stride = window_size * item_size# 列步幅: 在一个窗口内,从一个元素到下一个元素,跳过 1 个元素col_stride = item_sizenew_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内部机制有深入理解的高级用户,或在性能成为瓶颈且其他方法无法满足需求时使用。

以上就是NumPy数组非重叠滑动窗口的高效构建方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371022.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python怎么获取操作系统信息_Python获取系统信息指南
上一篇 2025年12月14日 11:04:09
python中怎么检查一个键是否存在于字典中?
下一篇 2025年12月14日 11:04:23

相关推荐

  • 抖音的私信关了怎么开启?私信关了对方发信息显示什么?

    抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?抖音的私信关了怎么开启?私信关了对方发信息显示什么?

    抖音的私信功能是用户之间交流的重要工具,但有时可能因设置调整而被关闭。本文将为您详细说明如何重新打开私信权限,并介绍关闭后他人发送消息时会看到哪些提示,助您更好地掌控社交互动与隐私安全。 一、抖音私信关闭了如何重新开启? 若您发现无法收到或发送私信,很可能是私信接收权限被关闭。只需几个简单步骤即可恢…

    2026年9月28日 • 用户投稿
    000
  • edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解

    edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解edge隐私设置里的跟踪防护怎么选_edge浏览器跟踪防护级别设置详解

    答案:调整Edge浏览器跟踪防护级别可解决网站加载异常和广告过多问题。首先了解基本、平衡、严格三种模式;接着根据需求选择基本模式以保证兼容性,或启用平衡模式拦截大部分第三方跟踪器,默认推荐;若需更强保护,可开启严格模式,但可能影响部分网站功能;最后针对特定网站通过地址栏盾牌图标自定义防护级别,确保使…

    2026年9月28日 • 用户投稿
    100
  • Linux ulimit命令详解与使用方法

    ulimit用于限制进程资源,如文件大小、进程数和内存;默认显示文件大小软限制,常用选项包括-f、-n、-u等,软限制可由用户调整,硬限制需root修改;通过ulimit -a查看所有限制,设置如ulimit -n 1024可限制打开文件数;永久配置需编辑/etc/security/limits.c…

    2026年9月28日
    000
  • sublime快捷键大全_Windows与macOS常用快捷键速查表

    sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表sublime快捷键大全_Windows与macOS常用快捷键速查表

    Sublime Text常用快捷键涵盖文件操作如Ctrl+N新建、Ctrl+O打开、Ctrl+S保存;编辑操作如Ctrl+D选词、Ctrl+L选行、Ctrl+Shift+L多行同时编辑;代码导航如Ctrl+P跳转文件、Ctrl+G跳转行、Ctrl+R前往函数;以及查找替换和注释等,熟练掌握可大幅提升…

    2026年9月28日 • 用户投稿
    000
  • web服务组件基础入门笔记小结

    web服务组件基础入门笔记小结web服务组件基础入门笔记小结web服务组件基础入门笔记小结web服务组件基础入门笔记小结

    web开发语言包括php、asp.net、jsp等,涵盖了多种用于构建web应用的编程语言。 Web服务系统主要分为Windows和Linux两大类。Windows系统代表有Windows 2003和Windows 2008,常见漏洞包括“永恒之蓝”(MS17-010)和MS08-067(虽然过时但…

    2026年9月28日 • 用户投稿
    000
  • VSCode如何集成天文数据分析工具 VSCode天文数据处理项目的环境配置

    安装anaconda或miniconda以管理python环境和依赖;2. 下载并安装vscode;3. 安装python、jupyter、remote – ssh和gitlens等扩展以增强功能;4. 使用conda或venv创建名为astro_env的虚拟环境并激活;5. 在虚拟环境…

    2026年9月28日
    200
  • 在线小说阅读平台排名2025-完结小说免费观看网站推荐

    在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐在线小说阅读平台排名2025-完结小说免费观看网站推荐

    起点、番茄、七猫是2025年看完结小说的主流平台,起点书库经典多,番茄免费资源丰富且分类清晰,七猫女频完结作品全,三者均支持免费阅读,适合不同偏好的读者。 想找2025年靠谱的在线小说平台看完结书?免费资源多、体验好的平台其实集中在几家大厂旗下。下面这几个,不仅书库全,完结作品丰富,而且支持直接阅读…

    2026年9月28日 • 用户投稿
    200
  • 解决“USB4 设备功能可能受限”:Win11 USB4 支持文档终于更新

    解决“USB4 设备功能可能受限”:Win11 USB4 支持文档终于更新解决“USB4 设备功能可能受限”:Win11 USB4 支持文档终于更新解决“USB4 设备功能可能受限”:Win11 USB4 支持文档终于更新解决“USB4 设备功能可能受限”:Win11 USB4 支持文档终于更新

    微软于2023年5月推出了kb5026446更新,在windows 11 22h2版本(build 22621.1778)中为usb4设备新增了一个专门的设置界面,位于“蓝牙和设备”选项之下。在此之前,usb4并未配备独立的支持页面,但日前官方已更新相关文档,提供了解决“usb4设备功能可能受限”问…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么配置python的虚拟环境_Python虚拟环境集成指南

    sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南sublime怎么配置python的虚拟环境_Python虚拟环境集成指南

    答案是通过创建自定义构建系统和配置项目文件确保Sublime Text使用指定虚拟环境。具体做法包括:在.sublime-build文件中指定虚拟环境Python解释器路径,结合.cmd字段设置无缓冲运行参数-u,并在.sublime-project文件中为项目定义独立的build_systems与…

    2026年9月28日 • 用户投稿
    000
  • 如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统如何在Docker中安装Linux环境_Docker容器运行Ubuntu系统

    首先拉取Ubuntu镜像并启动容器,使用docker pull ubuntu:20.04和docker run -it命令进入系统,安装软件需执行apt update并配置常用工具,通过-v参数实现文件挂载共享,建议用Dockerfile或提交容器保存配置以防丢失。 在Docker中安装Linux环…

    2026年9月28日 • 用户投稿
    100
  • 小红书发作品怎么屏蔽好友?小红书发作品屏蔽好友能看到吗

    小红书发作品怎么屏蔽好友?小红书发作品屏蔽好友能看到吗小红书发作品怎么屏蔽好友?小红书发作品屏蔽好友能看到吗小红书发作品怎么屏蔽好友?小红书发作品屏蔽好友能看到吗小红书发作品怎么屏蔽好友?小红书发作品屏蔽好友能看到吗

    在当下信息高速流通的时代,小红书已成为许多人记录生活、分享观点的重要平台。然而,并非所有内容都适合向所有人展示,尤其是当某些好友可能对特定内容产生误解或不适时。那么,如何在发布作品时屏蔽特定好友?被屏蔽的人还能看到吗?接下来,我将为你全面解析。 一、为何需要在小红书屏蔽好友 1. 维护个人隐私:部分…

    2026年9月28日 • 用户投稿
    200
  • 夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    彻底卸载夸克APP需先通过系统设置卸载主程序,再手动删除残留文件夹如/Android/data/com.quark.browser,清除账户同步数据,并使用清理工具深度扫描残留项。 如果您尝试从设备中移除夸克应用,但发现残留数据或配置文件仍然存在,则可能是由于卸载过程中未清除用户数据与缓存信息。以下…

    2026年9月28日 • 用户投稿
    100
  • DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南

    DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南

    本文将深入探讨DeepSeek如何实现模型联邦学习,并提供一套详细的分布式训练架构配置指南。我们将从联邦学习的核心概念出发,解析DeepSeek在这一领域的独特技术实现路径,并逐步讲解如何配置和部署其分布式训练架构,以帮助用户理解并实践联邦学习的强大能力。 ☞☞☞AI 智能聊天, 问答助手, AI …

    2026年9月28日 • 用户投稿
    000
  • Android游戏开发:基于线段交点的精确碰撞检测

    Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测

    本教程详细讲解了如何在Android Pong游戏中实现精确的线段交点检测与碰撞处理。通过将球的运动轨迹和挡板视为线段,并利用代数方程计算它们的交点,可以准确判断碰撞发生的位置。文章提供了具体的数学原理、Java实现代码以及在游戏开发中的应用注意事项,帮助开发者优化游戏物理反馈。 在android等…

    2026年9月28日 • 用户投稿
    100
  • Win10系统无法更新设备驱动更新被禁用

    Win10系统无法更新设备驱动更新被禁用Win10系统无法更新设备驱动更新被禁用Win10系统无法更新设备驱动更新被禁用Win10系统无法更新设备驱动更新被禁用

    windows 10 系统默认会自动更新系统和驱动程序,但有些用户可能会遇到驱动更新被禁用的情况。如果 win10 设备驱动更新被禁用了,该如何解决呢?接下来,小编将为大家详细介绍具体的操作步骤,希望能帮到有需要的朋友们。 Win10 系统无法更新设备驱动更新被禁用怎么办: 首先,按下 Win+R …

    2026年9月28日 • 用户投稿
    100
  • sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南

    sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南

    要实现Sublime Text侧边栏显示Git状态,需安装GitGutter插件。首先通过Package Control安装GitGutter,重启编辑器后即可在侧边栏文件名旁看到Git状态图标,如“M”表示修改,“A”表示新增,“?”表示未跟踪;同时行号区会显示增删改的彩色标记。该插件基于社区驱动…

    2026年9月28日 • 用户投稿
    000
  • Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程

    Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程

    首先检查Safari标签栏位置设置,1、打开设置进入Safari选项,2、将标签栏位置改为顶部;若无效,3、重启Safari浏览器;4、排查辅助功能中的便捷访问是否开启并关闭;最后更新iOS系统至最新版本以修复显示异常。 如果您发现Safari浏览器的地址栏显示在屏幕底部而非顶部,可能是由于设备界面…

    2026年9月28日 • 用户投稿
    000
  • 如何解决MySQL安装时权限不足的处理方法?

    如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?

    mysql安装时权限不足问题可通过以下方法解决:1.使用管理员权限运行安装程序;2.检查并修改安装目录权限;3.关闭uac;4.修改mysql配置文件指定用户目录;5.检查防火墙和杀毒软件;6.查看安装日志定位问题;7.手动创建数据目录并设置权限;8.考虑使用docker。 MySQL安装时权限不足…

    2026年9月28日 • 用户投稿
    000
  • SublimeText如何管理多个项目窗口_Workspace工作区使用方法

    SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法

    Sublime Text通过项目文件(.sublime-project)和工作区文件(.sublime-workspace)实现多项目高效管理,前者保存共享的静态配置如文件夹结构和构建系统,建议提交至版本控制;后者记录个人动态状态如打开文件、光标位置和布局,应被忽略以避免冲突。使用“快速切换项目”功…

    2026年9月28日 • 用户投稿
    200
  • Linux学习笔记(二)系统基础操作

    Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作

    Linux基础学习笔记精选专栏 本专栏由小雨ttt创建,致力于分享学习linux基础知识的过程。本专栏不是机械地介绍linux指令集,而是包含了作者亲自实践的操作过程,站在一个初学者的角度理解linux基础知识。 目前本专栏包含的内容有: Linux学习笔记(一)使用文本编辑器VimLinux学习笔…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信