【问题标题】:What is the inverse operation of indexing in numpy?numpy中索引的逆运算是什么?
【发布时间】:2021-06-01 09:10:43
【问题描述】:

我有两个数组ab,长度分别为nm,其中n > ma 的值在1、...、m 和b 中是一个排列1,...,m:

# n > m
n = 20000
m = 10000

a = np.random.randint(1, m + 1, size=n)
b = np.random.permutation(m) + 1

如何找到长度为 n 的数组 c,其值为 1,...,m 以使以下成立?

assert(b[c-1]==a)

【问题讨论】:

    标签: python numpy indexing


    【解决方案1】:

    这是一种方式:

    _, c = np.nonzero(b == a[:, None])
    assert np.allclose(b[c], a)
    

    请注意,它将b[c] 断言为a 而不是b[c-1]

    工作

    b == a[:, None] 行返回一个形状为 n x m 的布尔数组,其中每一行将a 的第行索引元素与b 的所有元素进行比较。这就是为什么在对应的列索引col 中有True 的行中有m 布尔元素,其中来自a 的元素等于b[col]。这使用broadcasting 进行元素比较。

    这是一个小插图:

    >>> m = 5
    >>> n = 10
    >>> a = np.random.randint(1, m+1, size=n)
    >>> b = np.random.permutation(m) + 1
    >>> a
    array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
    >>> b
    array([3, 5, 1, 2, 4])
    >>> b == a[:, None]
    array([[False,  True, False, False, False],
           [False, False, False, False,  True],
           [False, False, False,  True, False],
           [False, False,  True, False, False],
           [False, False, False, False,  True],
           [False, False, False,  True, False],
           [False,  True, False, False, False],
           [False, False, False, False,  True],
           [False,  True, False, False, False],
           [False, False, False,  True, False]])
    

    在应用 np.nonzero() 时,在此 2D 布尔数组上,您将获得 2 个 1D 数组,其中传递数组具有 True 元素的行和列索引,即,布尔数组的每个(i[k], j[k]) 位置都有True。在这里,我将行和列索引数组显示为ij

    >>> i, j = np.nonzero(b == a[:, None])
    >>> i
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> j
    array([1, 4, 3, 2, 4, 3, 1, 4, 1, 3])
    

    在某种程度上,j 列给出了如何通过使用j 索引b 来获得数组a

    >>> b[j]
    array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
    >>> a
    array([5, 4, 2, 1, 4, 2, 5, 4, 5, 2])
    

    基本上,a 中的元素来自 set b。上面的思路只是比较a中的每个元素在b中出现的位置,然后得到对应的索引。

    【讨论】:

    • @user175348:添加了示例说明。随时要求进一步澄清。
    猜你喜欢
    • 2019-03-06
    • 2016-06-19
    • 2016-07-21
    • 2020-02-09
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2011-05-04
    • 2014-01-25
    相关资源
    最近更新 更多