使用1D阵列的Numpy高级索引

时间:2015-07-13 14:41:33

标签: python arrays numpy indexing

所以给出像

这样的一维数组
x = np.array([0,1,2,3,4,5,6,7,8,9])

我想同时索引多个元素。例如,而不是

x[1]
x[2]

我想用

x[(1,2)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array

适用于1个2D数组,例如

x = np.array([[1,2,3,4],[5,6,7,8],[7,6,8,9]])
>>> x
array([[1, 2, 3, 4],
       [5, 6, 7, 8],
       [7, 6, 8, 9]])
>>> x[(1,2),(1,3)]
array([6, 9])
>>> x[(1,2),:]
array([[5, 6, 7, 8],
       [7, 6, 8, 9]])

正如您所看到的,对于nd-arrays,它工作正常! 有没有办法为1d阵列做这种索引?

2 个答案:

答案 0 :(得分:2)

你需要将索引放在一个不是元组的列表中,numpy使用元组来索引多维数组:

>>> x[[1,2]]
array([1, 2])

>>> x[(1,2)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices

另一个例子:

>>> x = np.array([6,4,0,8,77,11,2,12,67,90])
>>> x[[6,0]]
array([2, 6])

答案 1 :(得分:2)

您需要将索引包装在列表中,而不是元组:x[[1,2]]。这会触发advanced indexing,NumPy会返回一个新数组,其中包含您已编写的索引值。

NumPy会尽可能隐含地假设元组的每个元素都为数组的不同维度编制索引。您的数组有1维,而不是2,因此x[(1,2)]会引发错误。

x[(1,2), :]成功使用2D数组的原因是您已明确告知NumPy该数组具有(至少)两个维度并且从前两个轴说出您想要的内容。索引被解析为2元组((1,2), :),因此(1,2)用于沿第一轴进行高级索引。如果您只使用x[(1,2)]x[1,2],则会在第1行第2列获得单个元素。

解析索引对NumPy来说非常复杂,因为(与Python不同)有几种不同的索引方法可以使用。为了使事情进一步复杂化,可以在不同的轴上使用不同的方法!您可以在NumPy的mapping.c文件中研究确切的实现。