You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Numpy根据坐标列表从三维数组中提取对应元素且避免循环

问题解决方案

你需要用Numpy的高级整数索引实现需求,有两种常用的写法:

方法1:直接拆分坐标维度(适合固定维度场景)

把second数组的每一列分别作为first三个维度的索引即可,代码如下:

import numpy as np

# 示例数据
first = np.array([[[100, 101, 102],
                  [103, 104, 105],
                  [106, 107, 108]],

                 [[109, 110, 111],
                  [112, 113, 114],
                  [115, 116, 117]],

                 [[118, 119, 120],
                  [121, 122, 123],
                  [124, 125, 126]]])

second = np.array([[0, 1, 0],
                   [1, 1, 0],
                   [1, 0, 0],
                   [0, 0, 0],
                   [0, 1, 1],
                   [1, 1, 1],
                   [1, 0, 1],
                   [0, 0, 1]])

# 核心实现代码
result = first[second[:, 0], second[:, 1], second[:, 2]]

运行后得到的result和预期结果完全一致:array([103, 112, 109, 100, 104, 113, 110, 101])。

方法2:通用写法(适配任意维度数组)

如果数组维度不固定,可以用转置后转元组的写法,无需手动拆分每一列:

result = first[tuple(second.T)]

原理解释

直接写first[second]结果不对的原因是:Numpy会把传入的二维数组second默认作为第一个维度的索引序列,返回维度为(8, 3, 3, 3)的数组,和预期不符。而我们把second的每一列单独作为对应维度的索引,Numpy会按行匹配三个维度的坐标值,逐行取出对应位置的元素,得到一维的结果数组,全程都是向量化操作,没有循环开销。

内容的提问来源于stack exchange,提问作者LC117

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:36:05