2012-04-12 13 views
5

que estoy tratando de conseguir un bincount de una matriz numpy que es del tipo float:Numpy bincount() con flotadores

w = np.array([0.1, 0.2, 0.1, 0.3, 0.5]) 
print np.bincount(w) 

¿Cómo puede usar bincount() con valores de coma flotante y no int?

+2

qué se puede esperar como resultado de este tipo de operación "extraño"? – luke14free

+1

Quiero saber el número de ocurrencias de cada valor. Entonces el resultado sería: [2,1,1,1] Como 0.1 ocurre dos veces y los otros una vez. – user1220022

Respuesta

4

¿Desea algo como esto?

>>> from collections import Counter 
>>> w = np.array([0.1, 0.2, 0.1, 0.3, 0.5]) 
>>> c = Counter(w) 

Counter({0.10000000000000001: 2, 0.5: 1, 0.29999999999999999: 1, 0.20000000000000001: 1}) 

o, más bien de salida:

Counter({0.1: 2, 0.5: 1, 0.3: 1, 0.2: 1}) 

A continuación, puede solucionar el problema y obtener sus valores:

>>> np.array([v for k,v in sorted(c.iteritems())]) 

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

La salida de bincount no tendría sentido con flotadores:

>>> np.bincount([10,11]) 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]) 

ya que no hay una secuencia definida de flotadores.

9

Debe usar numpy.unique antes de usar bincount. De lo contrario, es ambiguo lo que estás contando. unique debería ser mucho más rápido que Counter para matrices numpy.

>>> w = np.array([0.1, 0.2, 0.1, 0.3, 0.5]) 
>>> uniqw, inverse = np.unique(w, return_inverse=True) 
>>> uniqw 
array([ 0.1, 0.2, 0.3, 0.5]) 
>>> np.bincount(inverse) 
array([2, 1, 1, 1]) 
3

Desde la versión 1.9.0, puede utilizar directamente np.unique:

w = np.array([0.1, 0.2, 0.1, 0.3, 0.5]) 
values, counts = np.unique(w, return_counts=True)