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)