Python: cómo hacer un histograma con contenedores de igual * tamaño *

Tengo un conjunto de datos, y quiero hacer un histograma de ellos. Necesito los contenedores para tener lo mismo.tamaño, por lo que quiero decir que deben contener el mismo número de objetos, en lugar del problema más común (numpy.histogram) de tenerigualmente espaciados contenedores Esto, naturalmente, vendrá a expensas de los anchos de los contenedores, que pueden ser diferentes, y en general lo serán.

Especificaré el número de contenedores deseados y el conjunto de datos, obteniendo los bordes de los contenedores a cambio.

Example:
data = numpy.array([1., 1.2, 1.3, 2.0, 2.1, 2.12])
bins_edges = somefunc(data, nbins=3)
print(bins_edges)
>> [1.,1.3,2.1,2.12]

Entonces, todos los contenedores contienen 2 puntos, pero sus anchos (0.3, 0.8, 0.02) son diferentes.

Hay dos limitaciones: - si un grupo de datos es idéntico, el contenedor que los contiene podría ser más grande. - si hay N datos y se solicitan M bins, habrá N / M bins más uno si N% M no es 0.

Este fragmento de código es un código que he escrito, que funcionó bien para pequeños conjuntos de datos. ¿Qué pasa si tengo 10 ** 9 + puntos y quiero acelerar el proceso?

  1 import numpy as np
  2 
  3 def def_equbin(in_distr, binsize=None, bin_num=None):
  4 
  5     try:
  6 
  7         distr_size = len(in_distr)
  8 
  9         bin_size = distr_size / bin_num
 10         odd_bin_size = distr_size % bin_num
 11 
 12         args = in_distr.argsort()
 13 
 14         hist = np.zeros((bin_num, bin_size))
 15 
 16         for i in range(bin_num):
 17             hist[i, :] = in_distr[args[i * bin_size: (i + 1) * bin_size]]
 18 
 19         if odd_bin_size == 0:
 20             odd_bin = None
 21             bins_limits = np.arange(bin_num) * bin_size
 22             bins_limits = args[bins_limits]
 23             bins_limits = np.concatenate((in_distr[bins_limits],
 24                                           [in_distr[args[-1]]]))
 25         else:
 26             odd_bin = in_distr[args[bin_num * bin_size:]]
 27             bins_limits = np.arange(bin_num + 1) * bin_size
 28             bins_limits = args[bins_limits]
 29             bins_limits = in_distr[bins_limits]
 30             bins_limits = np.concatenate((bins_limits, [in_distr[args[-1]]]))
 31 
 32         return (hist, odd_bin, bins_limits)

Respuestas a la pregunta(4)

Su respuesta a la pregunta