>>> 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[:, [0, 1, 0, 1]]
不同(应用 Python 的索引逻辑(这可能对于 numpy 是错误的))?我真的很想避免为选择过程创建一个新数组(np.arange)。 - orangea[:, [0, 1, 0, 1]]
,它会引发一个TypeError: indices must be integers, not tuple
...;-) 在NumPy中,“a[:, [0, 1, 0, 1]]
”的意思是“对于a
的每一行,创建一个四项数组,其中包含该行的第一个、第二个、再次是第一个和第二个元素。”因此,实际上没有替代创建np.arange
数组的方法。它仍然非常快,所以你真的不需要担心它。 - Jaimenumpy
的翻译。a[np.arange(4), [0, 1, 0, 1]]
是什么意思?直觉上对我来说它仍然与[:,]
相同... - orangenp.arange(4)
和[0, 1, 0, 1]
具有相同的形状,并且每个维度都有一个数组,所以返回值将是具有相同形状(4,)
的数组,其中每个数组用于索引它所占据的维度,即你将得到一个包含[a[0, 0], a[1, 1], a[2, 0], a[3, 1]]
的数组。这很棘手,甚至难以理解,但一旦掌握了它,它就非常、非常强大。 - Jaime