如何使用二维索引数组从三维 NumPy 数组中高效提取二维切片

发布时间 - 2026-01-30 00:00:00    点击率:

本文介绍如何利用 `np.choose` 从形状为 (10, 33, 66) 的 3d 数组中,依据形状为 (33, 66) 的二维索引数组,沿第一维(axis=0)精确选取对应元素,最终得到形状为 (33, 66) 的结果数组。

在 NumPy 中,当需要根据每个位置的索引从高维数组中“逐点选取”元素时(即所谓的“高级索引”或“花式索引”),np.choose 是一个简洁而高效的解决方案——尤其适用于沿首个轴(axis=0)进行索引的情形。

假设我们有如下数据:

import numpy as np

# 构造示例 3D 数组:(10, 33, 66)
data_3d = np.random.random((10, 33, 66))

# 构造 2D 索引数组:每个 (i, j) 位置指定应取 data_3d[k, i, j] 中的 k 值
index_2d = np.random.randint(0, 10, size=(33, 66))  # 值域 [0, 9]

目标是生成一个形状为 (33, 66) 的二维数组 result,其中:

result[i, j] == data_3d[index_2d[i, j], i, j]

✅ 正确做法:使用 np.choose

result = np.choose(index_2d, data_3d)

⚠️ 注意事项:

  • np.choose 要求 index_2d 的值必须是 非负整数,且严格小于 data_3d.shape[0](即 0 ≤ index_2d[i,j]
  • data_3d 会被自动视为一个包含 10 个 (33, 66) 子数组的序列(即 data_3d[0], data_3d[1], ..., data_3d[9]),np.choose 按 index_2d[i,j] 从中选择第 k 个子数组的 (i,j) 元素。
  • 该操作等价于但显著快于显式循环或 np.stack(...)[index_2d, ...] 的广播写法(后者需构造大中间数组)。

? 替代方案(兼容性更强,推荐用于复杂场景): 若索引维度不固定或需更高灵活性(如索引其他轴),可改用 np.ogrid + 高级索引:

i_grid, j_grid = np.ogrid[:33, :66]
result = data_3d[index_2d, i_grid, j_grid]  # 形状自动广播为 (33, 66)

此写法更直观、可扩展性强,且对索引范围检查更明确(支持布尔索引、负索引等),是现代 NumPy 实践中的首选。

✅ 总结:

  • 对「按二维索引沿第一维选取」任务,np.choose(index_2d, data_3d) 最简明;
  • 对需调试、扩展或索引非首轴的场景,优先使用 data_3d[index_2d, i_grid, j_grid];
  • 始终确保索引数组 dtype 为 in

    t,值域合法,避免运行时错误。


# numpy  # Array  # int  # 循环  # 切片  # 值域  # 组中  # 是一个  # 适用于  # 更高  # 布尔  # 更强  # 首个  # 即所谓  # 快于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作免费,什么网站能看正片电影?  利用JavaScript实现拖拽改变元素大小  如何快速搭建安全的FTP站点?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Python并发异常传播_错误处理解析【教程】  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在景安服务器上快速搭建个人网站?  Laravel Fortify是什么,和Jetstream有什么关系  怎么用AI帮你为初创公司进行市场定位分析?  java获取注册ip实例  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  香港服务器部署网站为何提示未备案?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何在IIS中配置站点IP、端口及主机头?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在万网主机上快速搭建网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  详解jQuery停止动画——stop()方法的使用  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  js实现点击每个li节点,都弹出其文本值及修改  详解Android——蓝牙技术 带你实现终端间数据传输  如何在企业微信快速生成手机电脑官网?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel怎么连接多个数据库_Laravel多数据库连接配置  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何在阿里云虚拟服务器快速搭建网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何构建满足综合性能需求的优质建站方案?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel怎么实现验证码(Captcha)功能  如何在阿里云虚拟主机上快速搭建个人网站?  如何在橙子建站中快速调整背景颜色?  如何在IIS中新建站点并解决端口绑定冲突?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  网页设计与网站制作内容,怎样注册网站?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册