Numpy:数组索引数组

时间:2015-03-11 06:56:58

标签: python arrays 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个元素)?

3 个答案:

答案 0 :(得分:3)

我认为这就是你想要的:

>>> 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)),以便它们的广播形状具有所需输出数组的形状。

答案 1 :(得分:0)

我认为您正在尝试使用a的元素索引idx的元素。您可以使用Python中的map执行此操作:

map(lambda subarray, index: subarray[index], a, idx)

返回一个列表,以获得一个numpy数组:

np.asarray(map(lambda subarray, index: subarray[index], a, idx))

<强>更新

使用您更新的示例进行说明:

a = np.asarray([[1, 2], [3, 4], [5, 6], [7, 8]])
idx = np.asarray([0, 1, 0, 1])
print np.asarray(map(lambda subarray, index: subarray[index], a, idx))
# [1 4 5 8]

请注意,这与numpy无关,所以我们可以取出所有np.asarray内容,这对列表也很好。

答案 2 :(得分:-1)

您正在对ndarray http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing进行高级索引编制。

  

高级索引始终作为一个广播和迭代:

这是触发的,因为在您的情况下,ndarray-index中的元素数量不等于您要编入索引的ndarray中的维度数。实际上,您可以生成切片的外积:索引中的每个元素都会生成索引数组的切片,而不是元素。

更新:

>>> map(lambda idx: a[idx[0],idx[1]], [[0,0], [1,1], [2,0], [3,1]])

这将返回:

[1, 4, 5, 8]