Inverso de la función bincount de numpy

Dada una matriz de recuentos de enteros c , ¿cómo puedo transformarla en una matriz de enteros inds modo que np.all(np.bincount(inds) == c) sea ​​verdadero?

Por ejemplo:

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

Contexto: estoy tratando de hacer un seguimiento de la ubicación de múltiples conjuntos de datos, mientras realizo el cálculo en todos ellos a la vez. Concatené todos los datos para el procesamiento por lotes, pero necesito una matriz de índice para extraer los resultados de vuelta.

Solución actual:

 def inverse_bincount(c): return np.array(list(chain.from_iterable([i]*n for i,n in enumerate(c)))) 

utilizando numpy.repeat

 np.repeat(np.arange(c.size), c) 

no se necesita numpy:

 c = [1,3,2,2] reduce(lambda x,y: x + [y] * c[y], range(len(c)), []) 

Lo siguiente es aproximadamente dos veces más rápido en mi máquina que la respuesta actualmente aceptada; aunque debo decir que me sorprende lo bien que lo hace np.repeat. Espero que sufra mucho por la creación temporal de objetos, pero lo hace bastante bien.

 import numpy as np c = np.array([1,3,2,2]) p = np.cumsum(c) i = np.zeros(p[-1],np.int) np.add.at(i, p[:-1], 1) print np.cumsum(i)