python – Numpy:数组索引数组

>>> idx = np.random.randint(2, size=(9, 31))
>>> a = np.random.random((9, 31, 2))
>>> a[idx].shape
(9, 31, 31, 2)

为什么上述不至少导致(9,31,1)或甚至更好(9,31)的形状?如何根据idx中的值返回选择?

更新

这可能是一个更具体和希望类似的例子:假设这个数组

a = np.asarray([[1, 2], [3, 4], [5, 6], [7, 8]])

我如何选择数组[1,4,5,8](即每行的第0,第1,第0,第1个元素)?

最佳答案 我想这就是你想要的:

>>> a[np.arange(9)[:, None], np.arange(31), idx].shape
(9, 31)

对于你的第二个例子,你会做:

>>> a[np.arange(4), [0, 1, 0, 1]]
array([1, 4, 5, 8])

在花式索引上阅读the docs,特别是关于每个维度here没有索引数组时会发生什么的部分:那些额外的np.arange数组放在那里以避免这种行为.

还要注意它们是如何重新整形的(使用[:,None]索引等效于.reshape(-1,1)),以便它们的广播形状具有所需输出数组的形状.

点赞