numpy索引时用slice与range为何返回不同的数组形状
Numpy slice与range索引的形状差异原因
这是numpy对基础索引和高级索引的不同形状拼接规则导致的:
slice属于基础索引,索引结果的轴顺序完全和原数组保留轴的顺序一致:标量索引会直接删除对应轴,slice则保留对应轴的长度。range会被转换为整数数组,属于高级索引,和基础索引混用时的形状规则:- 若高级索引没有被slice/省略号隔开、直接位于所有保留的基础索引末尾,高级索引的形状会直接追加到基础索引结果的形状之后
- 若高级索引的位置被slice/省略号和其他索引隔开,高级索引的形状会被插入到所有基础索引保留轴的最前方
第一个断言通过原因
两种写法返回形状均为(1,2):
d[:, 0, slice(0,2)]是基础索引::保留第一轴长度1,0是标量删除第二轴,slice(0,2)保留第三轴长度2,最终形状为(1,2)d[:, 0, range(0,2)]的高级索引在所有保留基础索引的末尾,没有被其他slice隔开,形状为(2,)的高级索引直接追加到基础结果形状(1,)之后,最终形状为(1,2),二者一致。
第二个断言失败原因
两种写法的轴拼接顺序不同:
d[0, :, slice(0,2)]是基础索引,最终轴顺序和原数组保留的轴顺序完全一致,得到形状(1,2)d[0, :, range(0,2)]属于高级索引和基础索引混用的场景,高级索引的位置被中间的slice隔开,最终高级索引对应的轴会被移动到基础保留轴的前方,得到形状(2,1),二者顺序相反因此断言失败。
内容的提问来源于stack exchange,提问作者t1e2a2p6
相关产品推荐
相关产品推荐

