代码之家  ›  专栏  ›  技术社区  ›  dabadaba

获取numpy数组中多个索引处的元素

  •  2
  • dabadaba  · 技术社区  · 7 年前

    我正试图访问numpy数组的特定行和列作为 documentation 解释了,但我想我漏掉了一些东西。

    我有以下数组:

    arr = np.random.randint(10, size=(6, 4))
    array([[1, 9, 6, 4],
           [8, 5, 0, 3],
           [3, 7, 3, 2],
           [1, 4, 8, 0],
           [5, 5, 8, 0],
           [0, 6, 4, 9]])
    

    我想得到第一行和最后一行,第一列,第三列和最后一列,所以我试着:

    arr[(0, -1),(0, 1, 3)]
    

    但这会产生以下错误:

    IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)
    

    我想我误解了这种整数索引。我希望这个结果:

    array([[1, 9, 4],
           [0, 6, 9]])
    

    我可以这样做,但感觉很尴尬:

    arr[(0,-1),:][:,(0,1,3)]
    

    我怎样才能得到不同维度的i元素?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Brad Solomon    7 年前

    一种方法是显式指定结果中每个元素的索引,其中的关键区别是行规范应为2d:

    >>> np.random.seed(444)
    >>> arr = np.random.randint(10, size=(6, 4))
    >>> arr
    array([[3, 0, 7, 8],
           [3, 4, 7, 6],
           [8, 9, 2, 2],
           [2, 0, 3, 8],
           [0, 6, 6, 0],
           [3, 0, 6, 7]])
    
    >>> rows = [[0],
    ...         [-1]]
    >>> cols = [0, 1, -1]
    >>> arr[rows, cols]
    array([[3, 0, 8],
           [3, 0, 7]])
    

    这个例子利用了行索引的广播。换句话说,您可以利用这样一个事实:除了第0列之外,其余两列的行都在重复它们自己。

    要使用高级索引,需要显式地选择所有元素。…但是,由于上面的索引数组只是重复它们自己,所以可以使用广播。例如,您不能利用广播,需要指定每个单独的索引,例如:

    rows = [[1, 2],
            [3, 4]]
    cols = [[2, 3],
            [1, 0]]
    

    在这种情况下,选择(1,2),(2,3)处的元素…

    this 文档中的示例。

    你可能会注意到这正是 np.ix_ (虽然我不是说这不是一个有用的函数):

    >>> rows, cols = np.ix_((0, -1),(0, 1, 3))
    
        2
  •  2
  •   hilberts_drinking_problem    7 年前

    你在找 np.ix_ :

    arr[np.ix_((0, -1),(0, 1, 3))]
    

    结果在

    array([[1, 9, 4],
           [0, 6, 9]])