广播更像:
In [280]: y[np.array([0,2,4])[...,None], np.array([1,2])]
Out[280]:
array([[ 1, 2],
[15, 16],
[29, 30]])
我向[0,2,4] 添加了一个维度,使其成为2d。 broadcast_arrays 可用于查看广播的数组长什么样:
In [281]: np.broadcast_arrays(np.array([0,2,4])[...,None], np.array([1,2]))
Out[281]:
[array([[0, 0],
[2, 2],
[4, 4]]),
array([[1, 2],
[1, 2],
[1, 2]])]
np.broadcast_arrays([[0],[2],[4]], [1,2]) 与没有 array 包装器的情况相同。 np.meshgrid([0,2,4], [1,2], indexing='ij') 是生成这些索引数组的另一种方式。
(meshgrid 或broadcast_arrays 生成的列表可以用作y[_] 的参数。)
所以说[1,2]用索引数组广播是对的,但是它省略了关于调整尺寸的那一点。
早一点他们就有这个例子:
y[np.array([0,2,4])]
相当于y[np.array([0,2,4]), :]。它选择 3 行,以及其中的所有项目。 1:3 的情况可以被认为是这种情况的扩展,选择 3 行,然后是 2 列。
y[[0,2,4],:][:,1:3]
如果广播太混乱,这可能是考虑索引的更好方法。
还有另一个文档页面可以更好地处理这个问题
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
在本文档中,基本索引涉及切片和整数
y[:,1:3], y[1,:], y[1, 1:3]
高级索引涉及数组(或列表)
y[[0,2,4],:]
这产生与y[::2,:] 相同的结果,除了列表情况产生一个副本,切片(基本)一个视图。
y[[0,2,4], [1,2,3]]是纯高级索引数组索引的情况,结果是3项,分别在(0,1)、(2,2)和(4,3)。
y[[0,2,4], 1:3] 是这个文档调用Combining advanced and basic indexing 的情况,“高级”来自“[0,2,4]”,基本来自“1:3”。
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing
查看更复杂的索引数组可能会增加一些洞察力。
In [222]: i=[[0,2],[1,4]]
与另一个列表一起使用,它是'纯'高级,结果被广播:
In [224]: y[i, [1,2]]
Out[224]:
array([[ 1, 16],
[ 8, 30]])
索引数组是:
In [234]: np.broadcast_arrays(i, [1,2])
Out[234]:
[array([[0, 2],
[1, 4]]),
array([[1, 2],
[1, 2]])]
[1,2] 列表刚刚扩展为 (2,2) 数组。
将它与切片一起使用是这种混合高级/基本的示例,结果是 3d (2,2,2)。
In [223]: y[i, 1:3]
Out[223]:
array([[[ 1, 2],
[15, 16]],
[[ 8, 9],
[29, 30]]])
广播的等价物是
y[np.array(i)[...,None], [1,2]]