Take N first values from every row in NumPy matrix that fulfill condition

后端 未结 1 1974
谎友^
谎友^ 2021-01-13 07:17

I have a numpy vector, and a numpy array.

I need to take from every row in the matrix the first N (lets say 3) values that are smaller than

相关标签:
1条回答
  • 2021-01-13 08:08

    Approach #1

    Here's one with broadcasting -

    def takeN_le_per_row_broadcasting(a, b, N=3): # a, b : 1D, 2D arrays respectively
        # First col indices in each row of b with <= corresponding one in a
        idx = (b <= a[:,None]).argmax(1)
    
        # Get all N ranged column indices
        all_idx = idx[:,None] + np.arange(N)
    
        # Finally advanced-index with those indices into b for desired output
        return b[np.arange(len(all_idx))[:,None], all_idx]
    

    Approach #2

    Inspired by NumPy Fancy Indexing - Crop different ROIs from different channels's solution, we can leverage np.lib.stride_tricks.as_strided for efficient patch extraction, like so -

    from skimage.util.shape import view_as_windows
    
    def takeN_le_per_row_strides(a, b, N=3): # a, b : 1D, 2D arrays respectively
        # First col indices in each row of b with <= corresponding one in a
        idx = (b <= a[:,None]).argmax(1)
    
        # Get 1D sliding windows for each element off data
        w = view_as_windows(b, (1,N))[:,:,0]
    
        # Use fancy/advanced indexing to select the required ones
        return w[np.arange(len(idx)), idx]
    
    0 讨论(0)
提交回复
热议问题