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

NumPy ndarray混合索引后数组形状差异原因咨询

问题解释:两种索引方式的形状差异原因

核心差异来自numpy的逗号式多维度索引和链式索引的底层处理逻辑不同:

1. 逗号式索引(y = x[0, 3:5, 8:10, [1,2,3,4,5], :])

numpy在处理多维度混合索引(切片+整数数组索引)时,会遵循固定规则:

  • 所有高级索引(这里的[1,2,3,4,5]属于整数数组索引,归为高级索引类型)对应的维度,会被优先排列在结果形状的最前面
  • 切片对应的维度则按原数组中的顺序跟在后面

在x的5维结构中,你指定的高级索引是第4个维度(从0开始计数),长度为5;剩下的切片维度依次是第1维(3:5,长度2)、第2维(8:10,长度2)、第4维(:,长度16)。所以最终形状被调整为(5,2,2,16)。

2. 链式索引(z = x[0][3:5, 8:10, [1,2,3,4,5], :])

链式索引是分步执行的:

  • 第一步x[0]返回一个4维数组,形状为(32,32,8,16)
  • 第二步对这个4维数组执行[3:5,8:10,[1,2,3,4,5],:]:此时高级索引对应这个4维数组的第3个维度,切片是前两个维度,结果的维度顺序完全遵循当前索引的顺序——切片维度(2,2)在前,高级索引维度(5)居中,最后是切片维度(16),所以形状为(2,2,5,16)

如何用逗号索引得到z的形状

如果想通过一次逗号索引得到(2,2,5,16)的形状,可以用np.take指定轴来避免高级索引的维度前置:

y_alt = x[0, 3:5, 8:10, :, :].take([1,2,3,4,5], axis=2)
print(y_alt.shape)  # 输出 (2,2,5,16)

或者调整索引逻辑,先通过切片得到前3个维度的子数组,再针对目标维度做索引,本质和链式索引逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:47:51