Numpy中np.array[a:b, c:d]与np.array[a:b][c:d]的差异问题
Numpy切片两种索引写法的差异与底层原理
Numpy官网提到的x[0,2] == x[0][2]仅在单元素索引场景巧合成立,切片场景不通用,核心原因是两种写法的执行逻辑完全不同:
1. 逗号分隔的多维度同时索引(a[:2, 1:4])
这是Numpy为多维数组设计的原生索引规则:
- 逗号前的切片
[:2]作用于数组的第一个维度(行维度),选中原数组前2行(索引0、1对应的行) - 逗号后的切片
1:4同时作用于数组的第二个维度(列维度),选中索引1、2、3对应的列 - 整个操作一次性完成,直接提取行列交叉位置的元素,最终得到2行3列的结果:
[['B' 'C' 'D'] ['G' 'H' 'I']]
2. 连续方括号的分步索引(a[:2][1:4])
这种写法遵循Python原生的从左到右的属性访问顺序,分两步执行:
- 第一步执行
a[:2],得到原数组前2行组成的新数组,shape为(2,5),内容如下:[['A' 'B' 'C' 'D' 'E'] ['F' 'G' 'H' 'I' 'J']] - 第二步对第一步返回的新数组执行
[1:4]切片,此时切片作用在该新数组的第一个维度(行维度),选中索引1到3的行。由于该新数组只有2行(索引最大为1),最终仅返回索引1对应的1行内容:[['F' 'G' 'H' 'I' 'J']]
补充说明其他测试用例逻辑
你测试的y = np.arange(35).reshape(5,7)场景同理:
y[1:5:2,::3]:同时对行维度选中索引1、3的行,对列维度选中步长为3的列(索引0、3、6),直接返回2行3列的结果y[1:5:2][::3]:第一步先拿到行索引1、3的2行新数组,第二步对该新数组的行维度做步长为3的切片,仅能返回索引0对应的第一行,因此两者结果不一致
单元素索引结果一致的原因
单元素索引时两种写法结果相等属于巧合:x[0][2]第一步取第0行的一维数组,第二步对该一维数组取索引2的元素,和x[0,2]直接取第0行第2列的元素指向同一个值,因此结果相等,并非两种写法规则通用。
内容的提问来源于stack exchange,提问作者Nameless
相关产品推荐
相关产品推荐

