NumPy三维矩阵索引a[:,1,3]与a[:][1][3]的差异是什么?
两种索引写法的核心区别
a[:,1,3] 是numpy原生的多轴同时索引,逗号分隔的每个参数直接对应原数组的不同维度;而a[:][1][3] 是逐层链式索引,每一步索引都只作用于上一步返回的新数组,仅对新数组的第0轴做索引,二者逻辑完全不同。
原数组结构说明
你定义的三维数组a的shape为(3, 2, 5),三个维度的含义分别是:
- 轴0(最外层):共3个元素,对应三组连续两天的日期块:[周一周二, 周三周四, 周五周六]
- 轴1(中间层):每个日期块有2个元素,对应块内的两天
- 轴2(最内层):每天有5个元素,对应日期名称+4个数值
a[:,1,3]的执行逻辑
逗号分隔的三个索引参数,分别对应原数组的三个轴,同时生效:
- 第一个参数
:作用于轴0:保留轴0的所有3个日期块 - 第二个参数
1作用于轴1:取每个日期块内的第1个元素(从0开始计数,也就是每个块的第二天:周二、周四、周六) - 第三个参数
3作用于轴2:取每个选中日期的第3个数值
最终返回长度为3的数组['21', '22', '20'],不会报错。
a[:][1][3]的执行逻辑
从左到右依次执行每一步索引,每一步都只对上一步返回的数组的第0轴做操作:
- 第一步
a[:]:返回和原数组完全一致的新数组,shape仍为(3, 2, 5) - 第二步
a[:][1]:对第一步返回的数组取轴0的第1个元素,也就是第二个日期块[['Wed',15,21,20,19],['Thu',11,20,22,21]],此时返回数组的shape为(2, 5) - 第三步
a[:][1][3]:对第二步返回的shape为(2, 5)的数组,尝试取轴0的第3个元素,但该数组轴0的长度只有2,最大合法索引为1,因此直接抛出IndexError,和你收到的报错信息完全匹配。
补充说明:为什么单元素索引时a[0,1,3]和a[0][1][3]结果一致?
因为单元素索引时,每一步链式索引刚好依次取到低一维的数组,最终落点和多轴同时索引的结果重合,所以输出相同,但这只是特殊场景下的巧合,当索引规则包含切片、布尔索引等逻辑时,二者的结果会完全不同。
内容的提问来源于stack exchange,提问作者user17184578
相关产品推荐
相关产品推荐

