含切片的NumPy高级索引结果形状判定规则咨询
NumPy高级索引结果形状的判定规则
核心逻辑
结果形状由两部分拼接而成:所有高级索引数组广播后的统一形状,加上切片/标量索引处理后剩余的维度(切片保留原长度维度,标量直接移除对应维度)。最终维度顺序为:高级索引广播的维度在前,切片保留的维度在后(按原数组中切片维度的先后顺序排列)。
详细步骤
- 分类索引类型:将每个维度的索引分为三类:
- 标量:单个数值(如
1),作用是移除对应维度。 - 切片:包括
:、start:end、start:end:step等,作用是保留对应维度,长度为切片的实际取值长度。 - 高级索引数组:非标量、非切片的序列/ndarray(如
[[0,1],[1,0]]),这类索引需要先进行广播。
- 标量:单个数值(如
- 广播高级索引数组:所有高级索引数组会被广播到相同的形状(记为
B),如果只有一个高级索引数组,B就是它本身的形状。 - 处理切片/标量维度:
- 标量索引对应的维度直接从原数组中移除。
- 切片索引对应的维度保留,长度为切片的实际取值长度。
- 拼接形状:最终结果的形状 =
B+ 所有切片保留的维度(按原数组中这些维度的先后顺序排列)。
结合你的例子验证
例子1:a[1, [[0, 1], [1, 0]]]
- 原数组形状:
(2, 3, 4) - 索引分类:
- 维度0:
1(标量,移除维度0) - 维度1:
[[0,1],[1,0]](高级索引数组,形状(2,2)) - 维度2:未指定,等价于切片
:(保留维度2,长度4)
- 维度0:
- 广播形状
B:(2,2) - 切片保留维度:
(4) - 最终形状:
(2,2) + (4) = (2,2,4),与实际结果一致。
例子2:a[1, 0:1, [[0, 1], [1, 0]]]
- 原数组形状:
(2, 3, 4) - 索引分类:
- 维度0:
1(标量,移除维度0) - 维度1:
0:1(切片,保留维度1,长度1) - 维度2:
[[0,1],[1,0]](高级索引数组,形状(2,2))
- 维度0:
- 广播形状
B:(2,2) - 切片保留维度:
(1) - 最终形状:
(2,2) + (1) = (2,2,1),与实际结果一致。
补充反例:a[1, 0, [[0, 1], [1, 0]]]
- 维度1:
0(标量,移除维度1) - 广播形状
B:(2,2) - 切片保留维度:无
- 最终形状:
(2,2),实际结果为array([[12, 13], [13, 12]]),符合预期。
内容的提问来源于stack exchange,提问作者hidetatz
相关产品推荐
相关产品推荐

