Numpy 高级索引:广播是如何发生的?

Numpy Advanced Indexing : How the broadcast is happening?

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

如果我们运行下面的语句

x[1:, [2,0,1]]

我们得到以下结果

array([[ 6,  4,  5],
      [10,  8,  9]])

根据 numpy 的文档:

Advanced indexes always are broadcast and iterated as one:

我无法理解索引配对是如何在这里发生以及广播的。

来自 NumPy 用户指南,Section 3.4.7 Combining index arrays with slices

the slice is converted to an index array np.array that is broadcast with the index array to produce the resultant array.

在我们的例子中,切片 1: 被转换为索引数组 np.array([[1,2]]) 具有 shape (1,2) 。这是 行索引数组 。 下一个索引数组(列索引数组)np.array([2,0,1])具有形状(3,2)

  • row index array shape (1,2)
  • column index array shape (3,2)

索引数组的形状不同。但它们可以广播到相同的形状。广播行索引数组以匹配列索引数组的形状。

选择的答案不正确。

  1. 这里的[2,0,1]确实有(3,)的形状,广播时不会延长

  2. 1: 意味着您首先对数组进行切片然后 广播。在广播期间,只需将切片 : 视为每个 运行 处的 0d 标量的占位符。所以我们得到:

    shape([2,0,1]) = (3,)
    shape([:]) = () -> (1,) -> (3,)
    

    所以它是 [:] 概念上扩展 形状 (3,),像这样:

    x[[1,1,1], [2,0,1]] =
    [6 4 5]
    x[[2,2,2], [2,0,1]] =
    [10 8 9]
    

    最后,我们需要将结果堆叠回去

    [[6 4 5]
     [10  8  9]]