Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inverse of numpy's bincount function

Tags:

python

numpy

Given an array of integer counts c, how can I transform that into an array of integers inds such that np.all(np.bincount(inds) == c) is true?

For example:

>>> c = np.array([1,3,2,2])
>>> inverse_bincount(c)  # <-- what I need

array([0,1,1,1,2,2,3,3])

Context: I'm trying to keep track of the location of multiple sets of data, while performing computation on all of them at once. I concatenate all the data together for batch processing, but I need an index array to extract the results back out.

Current workaround:

def inverse_bincount(c):
  return np.array(list(chain.from_iterable([i]*n for i,n in enumerate(c))))
like image 226
perimosocordiae Avatar asked Dec 08 '22 08:12

perimosocordiae


2 Answers

using numpy.repeat :

np.repeat(np.arange(c.size), c)
like image 70
Kiwi Avatar answered Dec 10 '22 20:12

Kiwi


no numpy needed :

c = [1,3,2,2]
reduce(lambda x,y: x + [y] * c[y], range(len(c)), [])
like image 43
njzk2 Avatar answered Dec 10 '22 22:12

njzk2