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)
索引数组的形状不同。但它们可以广播到相同的形状。广播行索引数组以匹配列索引数组的形状。
选择的答案不正确。
这里的[2,0,1]
确实有(3,)
的形状,广播时不会延长
而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]]
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)
索引数组的形状不同。但它们可以广播到相同的形状。广播行索引数组以匹配列索引数组的形状。
选择的答案不正确。
这里的
[2,0,1]
确实有(3,)
的形状,广播时不会延长而
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]]