0

0

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

霞舞

霞舞

发布时间:2026-01-30 13:34:10

|

428人浏览过

|

来源于php中文网

原创

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

本文介绍如何利用 `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

Grokipedia
Grokipedia

xAI推出的AI在线百科全书

下载
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 为 int,值域合法,避免运行时错误。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

113

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

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

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

46

2025.09.03

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

热门下载

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

精品课程

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

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