You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含切片的NumPy高级索引结果形状判定规则咨询

NumPy高级索引结果形状的判定规则

核心逻辑

结果形状由两部分拼接而成:所有高级索引数组广播后的统一形状,加上切片/标量索引处理后剩余的维度(切片保留原长度维度,标量直接移除对应维度)。最终维度顺序为:高级索引广播的维度在前,切片保留的维度在后(按原数组中切片维度的先后顺序排列)。

详细步骤

  1. 分类索引类型:将每个维度的索引分为三类:
    • 标量:单个数值(如1),作用是移除对应维度。
    • 切片:包括:、start:end、start:end:step等,作用是保留对应维度,长度为切片的实际取值长度。
    • 高级索引数组:非标量、非切片的序列/ndarray(如[[0,1],[1,0]]),这类索引需要先进行广播。
  2. 广播高级索引数组:所有高级索引数组会被广播到相同的形状(记为B),如果只有一个高级索引数组,B就是它本身的形状。
  3. 处理切片/标量维度:
    • 标量索引对应的维度直接从原数组中移除。
    • 切片索引对应的维度保留,长度为切片的实际取值长度。
  4. 拼接形状:最终结果的形状 = B + 所有切片保留的维度(按原数组中这些维度的先后顺序排列)。

结合你的例子验证

例子1:a[1, [[0, 1], [1, 0]]]

  • 原数组形状:(2, 3, 4)
  • 索引分类:
    • 维度0:1(标量,移除维度0)
    • 维度1:[[0,1],[1,0]](高级索引数组,形状(2,2))
    • 维度2:未指定,等价于切片:(保留维度2,长度4)
  • 广播形状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))
  • 广播形状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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:23:11