Indexing one array by another in numpy

前端 未结 4 771
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 05:12

Suppose I have a matrix A with some arbitrary values:

array([[ 2, 4, 5, 3],
       [ 1, 6, 8, 9],
       [ 8, 7, 0, 2]])

A

相关标签:
4条回答
  • 2020-11-22 05:27

    You can use NumPy's advanced indexing -

    A[np.arange(A.shape[0])[:,None],B]
    

    One can also use linear indexing -

    m,n = A.shape
    out = np.take(A,B + n*np.arange(m)[:,None])
    

    Sample run -

    In [40]: A
    Out[40]: 
    array([[2, 4, 5, 3],
           [1, 6, 8, 9],
           [8, 7, 0, 2]])
    
    In [41]: B
    Out[41]: 
    array([[0, 0, 1, 2],
           [0, 3, 2, 1],
           [3, 2, 1, 0]])
    
    In [42]: A[np.arange(A.shape[0])[:,None],B]
    Out[42]: 
    array([[2, 2, 4, 5],
           [1, 9, 8, 6],
           [2, 0, 7, 8]])
    
    In [43]: m,n = A.shape
    
    In [44]: np.take(A,B + n*np.arange(m)[:,None])
    Out[44]: 
    array([[2, 2, 4, 5],
           [1, 9, 8, 6],
           [2, 0, 7, 8]])
    
    0 讨论(0)
  • 2020-11-22 05:35

    More recent versions have added a take_along_axis function that does the job:

    In [203]: A = np.array([[ 2, 4, 5, 3], 
         ...:        [ 1, 6, 8, 9], 
         ...:        [ 8, 7, 0, 2]])                                                
    In [204]: B = np.array([[0, 0, 1, 2], 
         ...:        [0, 3, 2, 1], 
         ...:        [3, 2, 1, 0]])                                                 
    In [205]: np.take_along_axis(A,B,1)                                             
    Out[205]: 
    array([[2, 2, 4, 5],
           [1, 9, 8, 6],
           [2, 0, 7, 8]])
    

    There's also a put_along_axis.

    0 讨论(0)
  • 2020-11-22 05:38

    Following is the solution using for loop:

    outlist = []
    for i in range(len(B)):
        lst = []    
        for j in range(len(B[i])):
            lst.append(A[i][B[i][j]])
        outlist.append(lst)
    outarray = np.asarray(outlist)
    print(outarray)
    

    Above can also be written in more succinct list comprehension form:

    outlist = [ [A[i][B[i][j]] for j in range(len(B[i]))]
                    for i in range(len(B))  ]
    outarray = np.asarray(outlist)
    print(outarray)
    

    Output:

    [[2 2 4 5]
     [1 9 8 6]
     [2 0 7 8]]
    
    0 讨论(0)
  • 2020-11-22 05:41

    I know this is an old question, but another way of doing it using indices is:

    A[np.indices(B.shape)[0], B]
    

    output:

    [[2 2 4 5]
     [1 9 8 6]
     [2 0 7 8]]
    
    0 讨论(0)
提交回复
热议问题