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
相关产品推荐
相关产品推荐

