Find unique rows in numpy.array

后端 未结 20 2853
独厮守ぢ
独厮守ぢ 2020-11-21 10:57

I need to find unique rows in a numpy.array.

For example:

>>> a # I have
array([[1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 0, 0],
         


        
20条回答
  •  盖世英雄少女心
    2020-11-21 11:49

    We can actually turn m x n numeric numpy array into m x 1 numpy string array, please try using the following function, it provides count, inverse_idx and etc, just like numpy.unique:

    import numpy as np
    
    def uniqueRow(a):
        #This function turn m x n numpy array into m x 1 numpy array storing 
        #string, and so the np.unique can be used
    
        #Input: an m x n numpy array (a)
        #Output unique m' x n numpy array (unique), inverse_indx, and counts 
    
        s = np.chararray((a.shape[0],1))
        s[:] = '-'
    
        b = (a).astype(np.str)
    
        s2 = np.expand_dims(b[:,0],axis=1) + s + np.expand_dims(b[:,1],axis=1)
    
        n = a.shape[1] - 2    
    
        for i in range(0,n):
             s2 = s2 + s + np.expand_dims(b[:,i+2],axis=1)
    
        s3, idx, inv_, c = np.unique(s2,return_index = True,  return_inverse = True, return_counts = True)
    
        return a[idx], inv_, c
    

    Example:

    A = np.array([[ 3.17   9.502  3.291],
      [ 9.984  2.773  6.852],
      [ 1.172  8.885  4.258],
      [ 9.73   7.518  3.227],
      [ 8.113  9.563  9.117],
      [ 9.984  2.773  6.852],
      [ 9.73   7.518  3.227]])
    
    B, inv_, c = uniqueRow(A)
    
    Results:
    
    B:
    [[ 1.172  8.885  4.258]
    [ 3.17   9.502  3.291]
    [ 8.113  9.563  9.117]
    [ 9.73   7.518  3.227]
    [ 9.984  2.773  6.852]]
    
    inv_:
    [3 4 1 0 2 4 0]
    
    c:
    [2 1 1 1 2]
    

提交回复
热议问题