NumPy高效多维切片:无需循环处理变长起始索引

NumPy高效多维切片:无需循环处理变长起始索引

本文旨在介绍如何在numpy中高效地对一维数组进行多段切片,即使起始索引各不相同,但切片长度固定。我们将探讨两种无需使用python `for`循环的向量化方法:利用`np.linspace`和利用numpy的广播机制构建索引数组,从而显著提升处理效率和代码简洁性。

在数据处理和科学计算中,我们经常需要从一个大型数组中提取多段子数组。当这些子数组的起始位置不同,但它们的长度保持一致时,传统的做法是使用 for 循环迭代每个切片,然后将结果收集起来。然而,对于大型数据集,Python的 for 循环效率较低,NumPy提供了强大的向量化操作,可以更高效地完成此类任务。

传统循环切片方法

假设我们有一个一维NumPy数组 a,以及一系列起始索引 starts 和结束索引 ends。每个切片的长度 M 是固定的,即 ends[i] – starts[i] = M。使用 for 循环的实现方式如下:

import numpy as np# 为了演示,我们创建一个随机数组np.random.seed(42) # 固定随机种子以保证结果可复现a = np.arange(10) # 假设数组为 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# 定义起始和结束索引starts = (1, 2, 5)ends = (3, 4, 7)M = ends[0] - starts[0] # 切片长度 M = 2print(f"原始数组 a: {a}")print(f"起始索引 starts: {starts}")print(f"结束索引 ends: {ends}")print(f"切片长度 M: {M}")all_slices = []for s, e in zip(starts, ends):    all_slices.append(a[s:e])# 将所有切片堆叠成一个 (N, M) 形状的数组result_for_loop = np.stack(all_slices, axis=0)print(f"n通过 for 循环切片结果:n{result_for_loop}")# 预期输出:# [[1 2]#  [2 3]#  [5 6]]

这种方法虽然直观,但在处理大量切片时会因为循环的开销而变得低效。NumPy的优势在于其底层的C/Fortran实现,能够对整个数组进行操作,避免显式的Python循环。

NumPy向量化切片原理

NumPy允许使用一个整数数组作为索引来获取元素。例如,a[[0, 2, 4]] 将返回 a 中索引为0、2、4的元素。为了实现多段切片,我们可以构建一个二维索引数组 idx,其形状为 (N, M),其中 N 是切片数量,M 是每个切片的长度。idx 的每一行将包含一个切片所需的所有索引。然后,我们可以直接使用 a[idx] 来一步完成所有切片操作。

方法一:利用 np.linspace 生成索引

np.linspace 函数通常用于在指定区间内生成等间隔的数字。它也可以接受数组作为 start 和 stop 参数,这使得它能够并行生成多组等间隔序列。

# 沿用之前的 a, starts, ends, M# 将 starts 和 ends 转换为 NumPy 数组starts_arr = np.array(starts)ends_arr = np.array(ends)# 使用 linspace 生成索引数组# num=M 表示每个切片有 M 个元素# dtype=int 确保索引是整数# endpoint=False 表示不包含结束点,这符合 Python 切片 [start:end) 的行为# .T 进行转置,使每一行代表一个切片的所有索引idx_linspace = np.linspace(starts_arr, ends_arr, num=M, dtype=int, endpoint=False).Tprint(f"n使用 np.linspace 生成的索引数组:n{idx_linspace}")# 使用生成的索引数组进行切片result_linspace = a[idx_linspace]print(f"通过 np.linspace 切片结果:n{result_linspace}")

解释:

np.linspace(starts_arr, ends_arr, num=M, …):当 starts_arr 和 ends_arr 是数组时,linspace 会对每对 (starts_arr[i], ends_arr[i]) 生成一个长度为 M 的等间隔序列。endpoint=False:这是关键,因为Python的切片 [s:e] 不包含 e。例如,a[1:3] 包含索引1和2,长度为2。如果 starts=1, ends=3, M=2,我们需要生成 [1, 2]。linspace(1, 3, num=2, endpoint=False) 正好生成 [1., 2.]。.T:linspace 默认会将每个序列作为一列输出,所以我们需要转置使其变为 (N, M) 形状,其中 N 是切片数量,M 是切片长度。

方法二:利用广播机制构建索引数组

这种方法通常被认为是更简洁和更具NumPy风格的方式,它利用了NumPy强大的广播功能。

# 沿用之前的 a, starts, ends, M# 将 starts 转换为 NumPy 数组starts_arr = np.array(starts)# 构建一个列向量,形状为 (N, 1)starts_col_vec = starts_arr[:, None] # 等价于 starts_arr.reshape(-1, 1)# 构建一个行向量,表示每个切片内部的偏移量,形状为 (1, M)offsets = np.arange(M) # 例如,当 M=2 时,offsets 为 [0, 1]# 利用广播机制生成最终的索引数组# (N, 1) + (1, M) -> (N, M)idx_broadcast = starts_col_vec + offsetsprint(f"n使用广播机制生成的索引数组:n{idx_broadcast}")# 使用生成的索引数组进行切片result_broadcast = a[idx_broadcast]print(f"通过广播机制切片结果:n{result_broadcast}")

解释:

starts_arr[:, None]:这是一种创建列向量的常用技巧。它将 starts_arr 从 (N,) 形状变为 (N, 1)。np.arange(M):生成一个从0到 M-1 的序列,代表每个切片内部的相对偏移量。它的形状是 (M,)。starts_col_vec + offsets:当一个 (N, 1) 数组与一个 (M,) 或 (1, M) 数组相加时,NumPy的广播机制会将其扩展为 (N, M) 形状,然后执行元素级的加法。具体来说,starts_col_vec 的每一行会与 offsets 的所有元素相加。

例如,如果 starts_col_vec 是 [[1], [2], [5]],offsets 是 [0, 1]:[[1], [2], [5]] + [0, 1] 会被广播为 [[1, 1], [2, 2], [5, 5]] + [[0, 1], [0, 1], [0, 1]],最终得到 [[1, 2], [2, 3], [5, 6]]。

对比与选择

np.linspace 方法优点:对于需要生成均匀分布序列的场景非常直观。缺点:需要注意 endpoint 参数和可能需要的转置操作,理解上可能略微复杂。广播机制方法优点:代码简洁,逻辑清晰,是NumPy中构建复杂索引数组的强大且常用模式。通常被认为是更“NumPyic”的方式。缺点:需要对NumPy的广播规则有一定理解。

在大多数情况下,利用广播机制构建索引数组的方法(方法二) 因其简洁性和灵活性而更受推荐。

注意事项

切片长度一致性:这两种方法都要求所有切片的长度 M 必须是相同的。如果切片长度不一致,则不能直接生成一个 (N, M) 的索引数组,可能需要更复杂的处理(例如,如果允许不规则形状,可以使用列表推导式或对象数组)。索引类型:用于索引NumPy数组的数组必须是整数类型(dtype=int)。如果生成的索引数组是浮点类型,NumPy会报错或给出警告。多维数组切片:本文示例主要针对一维数组。对于多维数组,原理类似,但需要根据切片维度和具体需求来构建相应维度的索引数组。例如,如果要在二维数组的多个行上进行切片,则索引数组的结构会更复杂。性能:向量化操作通常比Python for 循环快几个数量级,尤其是在处理大型数组时。

总结

通过本文的介绍,我们学习了如何在NumPy中无需 for 循环,利用 np.linspace 或更常用的广播机制,高效地从一维数组中提取多段等长切片。这两种向量化方法不仅能显著提升代码性能,还能使代码更加简洁和易于维护。掌握这些技巧对于编写高效的NumPy代码至关重要。

以上就是NumPy高效多维切片:无需循环处理变长起始索引的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python3官网官方网址如何访问_Python3官方网址访问方式与操作流程
上一篇 2025年12月14日 20:58:24
Python docx 库:从Word文档表格中提取带编号列表的教程
下一篇 2025年12月14日 20:58:46

相关推荐

  • 抖音双十一的券能领几次?抖音双十一优惠券

    每年双十一,各大电商平台纷纷推出促销活动,作为热门购物平台之一的抖音自然也加入了这场年度大促。不少用户都在问:抖音双十一的券能领几次? 接下来,我们就为你全面解析抖音双十一的优惠券规则,助你轻松抢券、畅快购物。 一、抖音双十一活动时间安排 抖音双十一购物节通常从11月1日持续至11月11日,为期11…

    2026年8月30日
    000
  • 常用的mac命令大全

    常用的mac命令大全常用的mac命令大全常用的mac命令大全常用的mac命令大全

    掌握Mac终端命令能显著提升效率,核心在于理解与实践。从基础的文件导航(pwd、ls、cd)、文件操作(mkdir、touch、cp、mv、rm)到系统管理(top、df、du)、网络诊断(ping、ifconfig),逐步深入。善用man手册查阅命令详情,通过别名(如alias ll=&#8217…

    2026年8月30日 用户投稿
    100
  • 学信网报告的验证码在哪里_学信网报告验证码查看位置

    学信网验证码可通过电脑端官网、微信小程序或官方APP获取,登录后进入“在线验证报告”页面查看12位验证码。 如果您需要向用人单位或教育机构证明您的学历或学籍信息的真实有效性,通常需要提供学信网的在线验证码。该验证码是验证报告真伪的关键信息,与报告编号配合使用可在官网进行核验。以下是查询和获取学信网报…

    2026年8月30日
    000
  • 抖音双十一有满减活动吗?抖音双十一有满减活动吗是真的吗

    一年一度的“双十一”购物节即将到来,各大电商平台纷纷开启促销模式,而作为近年来迅速崛起的电商新势力,抖音自然也不会缺席这场年度大促。那么,抖音双十一有满减活动吗?是真的吗?接下来,就为大家详细解读抖音双十一的优惠机制与实用攻略,助你轻松省钱买好物! 一、抖音双十一活动时间安排 2023年抖音双十一活…

    2026年8月30日
    100
  • AI视频软件本地部署 | 快速上手AI视频生成指南

    首先完成环境配置并安装Python与FFmpeg,接着获取Moonshot AI和Pexels的API密钥,下载MoneyPrinterPlus工具包并部署ChatTTS语音模型,最后通过输入“科技产品介绍”等主题进行端到端测试,验证脚本生成、素材匹配、语音合成与视频合成全流程是否正常。 ☞☞☞AI…

    2026年8月30日
    000
  • Arm KleidiCV 实现与 OpenCV 集成,加速移动端计算机视觉工作负载

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 生成式和多模态人工智能(AI)的兴起,对计算机视觉(CV)技术的需求日益增长。CV技术能够解析和分析来自现实世界的图像信息,广泛应用于人脸识别、图像分类、图像滤镜和增强现实等领域。然而,在内存、…

    2026年8月30日
    000
  • 抖音双十一优惠券在哪领取?抖音双十一优惠券在哪领取苹果手机

    每年的双十一购物节都吸引着无数消费者的目光,而作为当下热门的短视频与电商融合平台,抖音也推出了丰富多彩的双十一促销活动。其中,最受关注的就是各类优惠券的发放。那么,抖音双十一优惠券到底在哪里领取?别担心,本文将为你全面解析抖音双十一抢券攻略,助你轻松拿下心仪商品! 抖音双十一优惠券领取全攻略 一、常…

    2026年8月29日
    100
  • 天眼查App怎么看企业经营范围_天眼查App查看企业经营范围详细方法

    答案:通过天眼查App可查询企业经营范围,具体方法有三种:一是进入企业详情页,在“工商信息”中查看;二是使用高级筛选功能,结合名称、行业等条件定位目标企业后查看详情;三是利用批量查询功能上传企业列表,对比查看各企业经营范围。 如果您想了解某家公司的主营业务和业务边界,查询其在工商部门登记的经营范围是…

    2026年8月29日
    000
  • 拼多多双11活动打几折?拼多多双11活动打几折优惠

    2025年拼多多双11优惠力度大,通过百亿补贴叠加消费券可低至2.5折,限时秒杀提供5折爆款,跨店满减如满300减50再降10%-20%,砍价免费拿和万人团可实现0元或超低价购。 如果您在寻找2025年拼多多双11期间的折扣力度,可能会发现实际到手价远低于商品原价,这得益于平台多重补贴叠加。以下是获…

    2026年8月29日
    000
  • 铁路12306怎么查历史订单记录_铁路12306历史订单查询方法

    首先通过12306官方APP或官网查询历史订单,进入“历史订单”页面并设置日期范围、乘车人等条件进行检索;其次可利用APP内“足迹”功能快速查看近期行程记录。 如果您需要查找过去在铁路12306平台上的购票记录,但发现常规订单页面无法显示较早的信息,可能是由于系统默认仅保留近期订单。以下是多种查询历…

    2026年8月29日
    100
  • 京东plus会员白条怎么取消?京东plus会员白条代扣了?如何取消

    首先关闭京东APP中的PLUS会员自动续费,进入“我的”-PLUS会员-设置-管理自动续费,关闭并验证;再通过京东金融APP解绑白条代扣,路径为“我的”-支付设置-免密支付/自动扣款,找到PLUS会员项目解约;若操作失败,可联系京东客服人工取消,提供手机号、订单号等信息完成解约。 如果您在使用京东P…

    2026年8月29日
    100
  • 手机淘宝商品怎么降价?手机淘宝商品怎么降价这么快

    商品快速降价因平台动态定价与促销,可利用官方立减、预售定金膨胀、领取大额红包、叠加跨店满减及品类补贴、关注返场与价保政策应对。 如果您发现手机淘宝上的商品价格快速变动,这通常是由于平台和商家采用了多种动态定价策略和促销活动。以下是帮助您理解并应对商品快速降价的详细步骤: 本文运行环境:iPhone …

    2026年8月29日
    000
  • 腾讯视频设备超限怎么解封_腾讯视频设备超限解封教程

    如果您在登录或使用腾讯视频时,提示设备数量已达到上限,则可能是因为您的账号已在过多设备上登录,触发了平台的设备管理限制。以下是解决此问题的具体步骤: 本文运行环境:小米14 Pro,Android 14 一、检查并管理已登录设备 腾讯视频VIP会员最多可在5台设备上登录,且仅支持2台设备同时播放。通…

    2026年8月29日
    100
  • 京东plus会员退费流程是什么?京东plus会员退款要多长时间

    开通京东PLUS会员后,若7日内未使用权益可全额退款;自动续费误扣款48小时内未使用权益可申请补救退款;联合会员需关闭续费并联系客服处理;退款原路返回,到账时间1-7个工作日。 如果您在开通京东PLUS会员后希望申请退款,需要根据您的具体情况判断是否符合退款条件。未使用任何权益的情况下,在有效期内的…

    2026年8月29日
    000
  • 腾讯视频设备超限被封怎么办_腾讯视频设备超限被封解决方法

    如果您在使用腾讯视频时,因同时登录的设备数量超过平台规定而被封号,则无法正常观看视频内容。以下是解决此问题的具体步骤: 本文运行环境:小米14,Android 14 一、通过手机号验证解封 此方法适用于首次被封禁的用户,系统提供快速验证通道以恢复账号正常使用。 1、打开腾讯视频APP,当出现封号提示…

    2026年8月29日
    100
  • laravel如何使用Spatie/laravel-activitylog记录用户活动_Laravel Spatie活动日志记录用户操作教程

    安装 laravel-activitylog 包并发布配置文件和迁移;2. 通过 LogsActivity trait 自动记录模型变更,如 User 模型的 name 和 email 字段变化;3. 使用 activity() 辅助函数手动记录用户操作,支持指定操作人、对象和附加属性;4. 查询 …

    2026年8月29日
    100
  • 百度地图怎么看路口实景图_百度地图路口实景图查看方式

    可通过图层、街景标识或地点详情页三种方法在百度地图查看路口实景:①点击图层中全景地图,进入淡蓝道路或黄色小人位置;②放大地图至出现黄色街景图标并点击;③搜索路口地标进入详情页,点击“街景”按钮查看实景。 如果您想在百度地图上查看某个路口的真实环境,以便更好地了解道路状况、车道分布或周边地标,可以通过…

    2026年8月29日
    000
  • 百度浏览器历史记录管理 快速查找和清理浏览数据的方法

    清理百度浏览器历史记录不仅能保护隐私,还能提升浏览器运行速度和安全性;通过菜单进入“历史”功能,使用搜索框输入关键词、域名或日期筛选记录,可高效定位目标;选择性删除单条记录或通过“清除浏览数据”选项批量清理历史、缓存和Cookie,有助于减少网页加载异常、防止行为追踪,使浏览更流畅安全。 管理百度浏…

    2026年8月29日
    100
  • 如何解决字符串比较和差异分析问题?jfcherng/php-sequence-matcher助你提升PHP处理效率

    可以通过一下地址学习composer:学习地址 在处理文本比较和差异分析时,我曾遇到一个棘手的问题:如何在大量文本中高效地找出最长公共子序列。这在开发版本控制系统或文本差异分析工具时尤为重要。我尝试了多种方法,但效果都不理想。直到我发现了 jfcherng/php-sequence-matcher …

    用户投稿 2026年8月29日
    000
  • 橙光阅读器怎么更新到最新版本_橙光阅读器版本升级操作

    首先通过应用商店手动更新橙光阅读器,若无更新则访问官网下载最新安装包并允许第三方安装,最后可开启应用商店自动更新功能以保持版本最新。 如果您在使用橙光阅读器时遇到功能异常、加载缓慢或无法进入某些互动故事的情况,可能是由于当前版本过旧导致与新作品不兼容。以下是将橙光阅读器更新至最新版本的具体操作方法:…

    2026年8月29日
    000

发表回复

登录后才能评论
关注微信