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)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage