Sort invariant for numpy.argsort with multiple dimensions

前端 未结 3 1406
谎友^
谎友^ 2020-11-30 11:50

numpy.argsort docs state

Returns:
index_array : ndarray, int Array of indices that sort a along the specified axis. If a is one-dimensional, <

3条回答
  •  忘掉有多难
    2020-11-30 12:23

    The numpy issue #8708 has a sample implementation of take_along_axis that does what I need; I'm not sure if it's efficient for large arrays but it seems to work.

    def take_along_axis(arr, ind, axis):
        """
        ... here means a "pack" of dimensions, possibly empty
    
        arr: array_like of shape (A..., M, B...)
            source array
        ind: array_like of shape (A..., K..., B...)
            indices to take along each 1d slice of `arr`
        axis: int
            index of the axis with dimension M
    
        out: array_like of shape (A..., K..., B...)
            out[a..., k..., b...] = arr[a..., inds[a..., k..., b...], b...]
        """
        if axis < 0:
           if axis >= -arr.ndim:
               axis += arr.ndim
           else:
               raise IndexError('axis out of range')
        ind_shape = (1,) * ind.ndim
        ins_ndim = ind.ndim - (arr.ndim - 1)   #inserted dimensions
    
        dest_dims = list(range(axis)) + [None] + list(range(axis+ins_ndim, ind.ndim))
    
        # could also call np.ix_ here with some dummy arguments, then throw those results away
        inds = []
        for dim, n in zip(dest_dims, arr.shape):
            if dim is None:
                inds.append(ind)
            else:
                ind_shape_dim = ind_shape[:dim] + (-1,) + ind_shape[dim+1:]
                inds.append(np.arange(n).reshape(ind_shape_dim))
    
        return arr[tuple(inds)]
    

    which yields

    >>> A = np.array([[3,2,1],[4,0,6]])
    >>> B = np.array([[3,1,4],[1,5,9]])
    >>> i = A.argsort(axis=-1)
    >>> take_along_axis(A,i,axis=-1)
    array([[1, 2, 3],
           [0, 4, 6]])
    >>> take_along_axis(B,i,axis=-1)
    array([[4, 1, 3],
           [5, 1, 9]])
    

提交回复
热议问题