Python: Wie erstelle ich ein Histogramm mit gleich großen Behältern?
Ich habe eine Reihe von Daten und möchte daraus ein Histogramm erstellen. Ich brauche die Mülleimer, um das gleiche zu habenGröße, womit ich meine, dass sie die gleiche Anzahl von Objekten enthalten müssen, anstatt das häufigere (numpy.histogram) Problem zu habengleichmäßig verteilt Behälter. Dies geht natürlich zu Lasten der Behälterbreiten, die unterschiedlich sein können - und im Allgemeinen auch werden.
Ich gebe die Anzahl der gewünschten Fächer und den Datensatz an und erhalte dafür die Fächerkanten.
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]
Die Fächer enthalten also alle 2 Punkte, aber ihre Breiten (0,3, 0,8, 0,02) sind unterschiedlich.
Es gibt zwei Einschränkungen: - Wenn eine Gruppe von Daten identisch ist, kann der Behälter, in dem sie enthalten sind, größer sein. - Wenn es N Daten gibt und M Fächer angefordert werden, gibt es N / M Fächer plus eins, wenn N% M nicht 0 ist.
Dieses Stück Code ist ein Cruft, das ich geschrieben habe und das für kleine Datensätze gut funktioniert hat. Was ist, wenn ich 10 ** 9 + Punkte habe und den Prozess beschleunigen möchte?
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)