How to rearrange array based upon index array

前端 未结 4 600
臣服心动
臣服心动 2020-12-13 17:51

I\'m looking for a one line solution that would help me do the following.

Suppose I have

array = np.array([10, 20, 30, 40, 50])

I\

相关标签:
4条回答
  • 2020-12-13 18:02

    for those whose index is 2d array, you can use map function. Here is an example:

    a = np.random.randn(3, 3)
    print(a)
    print(np.argsort(a))
    
    print(np.array(list(map(lambda x, y: y[x], np.argsort(a), a))))
    

    the output is

    [[-1.42167035  0.62520498  2.02054623]
     [-0.17966393 -0.01561566  0.24480554]
     [ 1.10568543  0.00298402 -0.71397599]]
    [[0 1 2]
     [0 1 2]
     [2 1 0]]
    [[-1.42167035  0.62520498  2.02054623]
     [-0.17966393 -0.01561566  0.24480554]
     [-0.71397599  0.00298402  1.10568543]]
    
    0 讨论(0)
  • 2020-12-13 18:05

    If you want to sort it but descending:

    a = np.array([1,2,3,4,5])
    np.argsort(a)
    > array([0, 1, 2, 3, 4])
    np.argsort(-a)
    > array([4, 3, 2, 1, 0])
    
    0 讨论(0)
  • 2020-12-13 18:09

    You can simply use your "index" list directly, as, well, an index array:

    >>> arr = np.array([10, 20, 30, 40, 50])
    >>> idx = [1, 0, 3, 4, 2]
    >>> arr[idx]
    array([20, 10, 40, 50, 30])
    

    It tends to be much faster if idx is already an ndarray and not a list, even though it'll work either way:

    >>> %timeit arr[idx]
    100000 loops, best of 3: 2.11 µs per loop
    >>> ai = np.array(idx)
    >>> %timeit arr[ai]
    1000000 loops, best of 3: 296 ns per loop
    
    0 讨论(0)
  • 2020-12-13 18:27

    For those who have the same confusion, I am actually looking for a slightly different version of "rearrange array based upon index". In my situation, the index array is indexing the target array instead of the source array. In other words, I am try to rearrange an array based on its position in the new array.

    In this case, simply apply an argsort before indexing. E.g.

    >>> arr = np.array([10, 20, 30, 40, 50])
    >>> idx = [1, 0, 3, 4, 2]
    >>> arr[np.argsort(idx)]
    array([20, 10, 50, 30, 40])
    

    Note the difference between this result and the desired result by op.

    One can verify back and forth

    >>> arr[np.argsort(idx)][idx] == arr
    array([ True,  True,  True,  True,  True])
    >>> arr[idx][np.argsort(idx)] == arr
    array([ True,  True,  True,  True,  True])
    
    0 讨论(0)
提交回复
热议问题