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

Numpy:按数组索引数组

  •  4
  • orange  · 技术社区  · 11 年前
    >>> 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个元素)?

    2 回复  |  直到 11 年前
        1
  •  4
  •   Jaime    11 年前

    我想这就是你想要的:

    >>> 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) )使得它们的广播形状具有期望输出阵列的形状。

        2
  •  -1
  •   emvee    11 年前

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

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

    这是因为在您的情况下,ndarray索引中的元素数不等于要索引到的ndarray中的维度数。实际上,您正在生成切片的外部乘积:索引中的每个元素都生成索引数组的切片,而不是元素。

    更新:

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

    这将返回:

    [1, 4, 5, 8]