pythonperformancenumpy

How to count num of elements vector with numpy python


For example if i have:

a=np.array([[1,1,4,1,4,3,1]])

We can see that we have the number 1 four times, the number 4 twice and 3 only ones.

I want to have the following result:

array(4,4,2,4,2,1,4)

As you can see: each cell is replaced by the count of it's element.

How can i do it in the best efficient way?


Solution

  • One vectorized approach with np.unique and np.searchsorted -

    # Get unique elements and their counts
    unq,counts = np.unique(a,return_counts=True)
    
    # Get the positions of unique elements in a. 
    # Use those positions to index into counts array for final output.
    out = counts[np.searchsorted(unq,a.ravel())]
    

    Sample run -

    In [86]: a
    Out[86]: array([[1, 1, 4, 1, 4, 3, 1]])
    
    In [87]: out
    Out[87]: array([4, 4, 2, 4, 2, 1, 4])
    

    As per the comments from @Jaime, you can use np.unique alone like so -

    _, inv_idx, counts = np.unique(a, return_inverse=True, return_counts=True)
    out = counts[inv_idx]