第一个索引列表必须是 (2,1) 形状(或等效列表):
In [31]: a[[[2], [5]], [3, 6, 9]]
Out[31]:
array([[2, 2, 2],
[5, 5, 5]])
你明白broadcasting的错误信息是什么意思吗?
对于简单的加法,(2,1) 数组与 (3,) 一起广播以产生 (2,3) 结果:
In [32]: I, J = np.array((2, 5)), np.array((3, 6, 9))
In [33]: I, J
Out[33]: (array([2, 5]), array([3, 6, 9]))
In [34]: I + J
Traceback (most recent call last):
Input In [34] in <module>
I + J
ValueError: operands could not be broadcast together with shapes (2,) (3,)
In [35]: I[:, None] + J
Out[35]:
array([[ 5, 8, 11],
[ 8, 11, 14]])
同样的想法也适用于多个数组的索引。
您的a 可以使用相同的逻辑创建:
In [38]: np.arange(10)[:, None] + np.zeros(10,int)
Out[38]:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
[7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])
使用 2 个大小匹配的数组(列表),效果是选择一个“对角线”或一维值数组(而不是您尝试获取的块):
In [39]: a[[2, 3], [5, 6]]
Out[39]: array([2, 3])
In [40]: a[2, 5], a[3, 6]
Out[40]: (2, 3)