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

如何用形状为(h,w)的数组Y索引形状为(h,w,d)的数组X的最后维度?

提取多维数组指定维度索引元素的实现方案

针对你提出的需求——从形状为(h, w, d)的数组X中,用形状为(h, w)的索引数组Y提取最后一维对应位置的元素,最终得到(h, w)的结果,下面是几种实用的numpy实现方法:

1. 花式索引(最直观的写法)

通过生成和Y匹配的前两维索引,组合Y作为最后一维索引,直接定位目标元素:

import numpy as np

# 构造示例数据
h, w, d = 2, 3, 4
X = np.random.rand(h, w, d)
Y = np.random.randint(0, d, size=(h, w))

# 生成行、列索引矩阵
row_idx, col_idx = np.indices((h, w))
# 提取对应元素
output = X[row_idx, col_idx, Y]

这里row_idx和col_idx分别是(h, w)形状的矩阵,对应每个位置的行、列坐标,加上Y的索引,就能精准取到X中每个(h,w)位置对应的最后一维元素,结果自然是(h,w)形状。

2. 使用np.take函数(简洁高效)

np.take可以直接沿指定维度提取元素,指定axis=2(最后一维)后传入Y,再去掉冗余的单维度:

output = np.take(X, Y, axis=2).squeeze()

np.take返回的结果形状是(h, w, 1),用squeeze()去掉最后一个长度为1的维度,就得到了目标的(h,w)数组。

3. 重塑数组+扁平化索引(适合理解底层逻辑)

先把X和Y都扁平化,提取后再恢复原形状:

# 把X重塑为二维数组,Y重塑为一维数组
X_flat = X.reshape(-1, d)
Y_flat = Y.reshape(-1)
# 提取元素后再重塑回原形状
output = X_flat[np.arange(h*w), Y_flat].reshape(h, w)

np.arange(h*w)生成扁平化后的行索引,搭配Y_flat的列索引,就能准确取到每个位置的元素,最后重塑回(h,w)即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:32:35