【问题标题】:Numpy Advanced Indexing with 1D array具有一维数组的 Numpy 高级索引
【发布时间】:2015-07-13 14:41:33
【问题描述】:

所以给定一个像这样的一维数组

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 个二维数组,例如

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 它工作正常! 有什么方法可以对一维数组进行这种索引?

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

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


    只要有可能,NumPy 就会隐式假设 tuple 的每个元素都索引数组的不同维度。您的数组有 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 文件中研究具体的实现。

    【讨论】:

      【解决方案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])
      

      【讨论】:

        猜你喜欢
        • 2019-01-09
        • 2016-07-12
        • 2017-12-16
        • 2020-01-12
        • 1970-01-01
        • 2020-03-25
        • 2017-03-18
        • 1970-01-01
        • 2022-01-19
        相关资源
        最近更新 更多