¿Cómo funciona numpy.histogram ()?


120

Mientras leía sobre numpy, encontré la función numpy.histogram().

¿Para qué sirve y cómo funciona? En los documentos mencionan bins : ¿Qué son?

Algunas búsquedas en Google me llevaron a la definición de histogramas en general . Lo entiendo. Pero, lamentablemente, no puedo vincular este conocimiento a los ejemplos que se dan en los documentos.

Respuestas:


167

Un intervalo es un rango que representa el ancho de una sola barra del histograma a lo largo del eje X. También podría llamar a esto el intervalo. (Wikipedia las define más formalmente como "categorías disjuntas").

La histogramfunción Numpy no dibuja el histograma, pero calcula las ocurrencias de datos de entrada que caen dentro de cada contenedor, lo que a su vez determina el área (no necesariamente la altura si los contenedores no tienen el mismo ancho) de cada barra.

En este ejemplo:

 np.histogram([1, 2, 1], bins=[0, 1, 2, 3])

Hay 3 contenedores, para valores que van de 0 a 1 (excluido 1), 1 a 2 (excluido 2) y 2 a 3 (incl. 3), respectivamente. La forma en que Numpy define estos bins es dando una lista de delimitadores ( [0, 1, 2, 3]) en este ejemplo, aunque también devuelve los bins en los resultados, ya que puede elegirlos automáticamente desde la entrada, si no se especifica ninguno. Si bins=5, por ejemplo, utilizará 5 contenedores de igual ancho repartidos entre el valor de entrada mínimo y el valor de entrada máximo.

Los valores de entrada son 1, 2 y 1. Por lo tanto, el bin "1 a 2" contiene dos apariciones (los dos 1valores) y el bin "2 a 3" contiene una ocurrencia (el 2). Estos resultados están en el primer elemento de la tupla devuelta: array([0, 2, 1]).

Dado que los contenedores aquí tienen el mismo ancho, puede usar el número de ocurrencias para la altura de cada barra. Cuando se dibuje, tendrías:

  • una barra de altura 0 para rango / intervalo [0,1] en el eje X,
  • una barra de altura 2 para rango / contenedor [1,2],
  • una barra de altura 1 para rango / contenedor [2,3].

Puede trazar esto directamente con Matplotlib (su histfunción también devuelve los contenedores y los valores):

>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), <a list of 3 Patch objects>)
>>> plt.show()

ingrese la descripción de la imagen aquí


8
También puede estar interesado en esta respuesta si desea trazarlos. Matplotlib también puede calcularlos directamente . Vea ejemplos aquí y aquí .
Bruno

En el conjunto de datos de flores de iris, count, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, densidad = True) me da mis recuentos en valores flotantes, de acuerdo con el ejemplo que ha dado, cómo puede contar puede ser un valor flotante?
Dipen Gajjar

La mejor respuesta debe tener en cuenta que se ignoraría un número significativo de valores por encima del borde derecho más grande. Siempre agregue valores por encima del borde de las rejillas al último contenedor o cambie el último binsvalor creado manualmente al valor máximo en la matriz.
A.Ametov

@DipenGajjar Si omite "densidad = Verdadero", no verá eso. La palabra clave densidad le da un histograma "normalizado" en el que se representa la función de densidad de probabilidad. Puedes leer sobre esto aquí .
BUFU

67
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

A continuación, histindica que hay 0 elementos en el contenedor # 0, 2 en el contenedor # 1, 4 en el contenedor # 3, 1 en el contenedor # 4.

print(hist)
# array([0, 2, 4, 1])   

bin_edges indica que bin # 0 es el intervalo [0,1), bin # 1 es [1,2), ..., bin # 3 es [3,4).

print (bin_edges)
# array([0, 1, 2, 3, 4]))  

Juega con el código anterior, cambia la entrada a np.histogramy mira cómo funciona.


Pero una imagen vale más que mil palabras:

import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

ingrese la descripción de la imagen aquí


4
Creo que esto sería más preciso: plt.bar(bin_edges[:-1], hist, width=1)y plt.xlim(min(bin_edges), max(bin_edges)), para que las barras se ajusten a su ancho esperado (de lo contrario, puede haber un contenedor más pequeño sin valores intermedios).
Bruno

¿Es posible utilizar el "hist" obtenido en el formato numérico anterior en la función "plt.hist (...)"? Porque en el método de barra, lo proporciona como una "y", mientras que aquí en hist, solo hay x ..
kbg

7

Otra cosa útil para hacer numpy.histogrames trazar la salida como las coordenadas xey en un gráfico de líneas. Por ejemplo:

arr = np.random.randint(1, 51, 500)
y, x = np.histogram(arr, bins=np.arange(51))
fig, ax = plt.subplots()
ax.plot(x[:-1], y)
fig.show()

ingrese la descripción de la imagen aquí

Esta puede ser una forma útil de visualizar histogramas donde le gustaría un mayor nivel de granularidad sin barras en todas partes. Muy útil en histogramas de imágenes para identificar valores extremos de píxeles.


Esto es muy útil para ver proyecciones de filas y columnas de imágenes.
SKR
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.