Wie funktioniert numpy.histogram ()?

119

Beim Lesen von numpy bin ich auf die Funktion gestoßen numpy.histogram().

Wofür ist es und wie funktioniert es? In den Dokumenten erwähnen sie Behälter : Was sind sie?

Ein bisschen googeln führte mich zur Definition von Histogrammen im Allgemeinen . Ich verstehe das. Leider kann ich dieses Wissen nicht mit den Beispielen in den Dokumenten verknüpfen.

Aufwind
quelle

Antworten:

166

Ein Bin ist ein Bereich, der die Breite eines einzelnen Balkens des Histogramms entlang der X-Achse darstellt. Sie können dies auch als Intervall bezeichnen. (Wikipedia definiert sie formeller als "disjunkte Kategorien".)

Die Numpy- histogramFunktion zeichnet das Histogramm nicht, berechnet jedoch das Auftreten von Eingabedaten, die in die einzelnen Fächer fallen. Dies bestimmt wiederum den Bereich (nicht unbedingt die Höhe, wenn die Fächer nicht gleich breit sind) jedes Balkens.

In diesem Beispiel:

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

Es gibt 3 Fächer für Werte im Bereich von 0 bis 1 (ohne 1), 1 bis 2 (ohne 2) bzw. 2 bis 3 (einschließlich 3). Die Art und Weise, wie Numpy diese Bins definiert, indem [0, 1, 2, 3]in diesem Beispiel eine Liste von Trennzeichen ( ) angegeben wird, obwohl auch die Bins in den Ergebnissen zurückgegeben werden, da sie automatisch aus der Eingabe ausgewählt werden können, wenn keine angegeben sind. Wenn bins=5zum Beispiel 5 Bins mit gleicher Breite verwendet werden, die zwischen dem minimalen Eingabewert und dem maximalen Eingabewert verteilt sind.

Die Eingabewerte sind 1, 2 und 1. Daher enthält Bin "1 bis 2" zwei Vorkommen (die beiden 1Werte), und Bin "2 bis 3" enthält ein Vorkommen (das 2). Diese Ergebnisse befinden sich im ersten Element des zurückgegebenen Tupels : array([0, 2, 1]).

Da die Fächer hier gleich breit sind, können Sie die Anzahl der Vorkommen für die Höhe jedes Balkens verwenden. Wenn gezeichnet, hätten Sie:

  • ein Balken der Höhe 0 für Bereich / Behälter [0,1] auf der X-Achse,
  • ein Balken der Höhe 2 für Reichweite / Behälter [1,2],
  • ein Balken der Höhe 1 für Reichweite / Behälter [2,3].

Sie können dies direkt mit Matplotlib zeichnen (seine histFunktion gibt auch die Bins und die Werte zurück):

>>> 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()

Geben Sie hier die Bildbeschreibung ein

Bruno
quelle
8
Diese Antwort könnte Sie auch interessieren , wenn Sie sie zeichnen möchten. Matplotlib kann sie auch direkt berechnen . Beispiele hier und hier .
Bruno
Im Irisblumendatensatz gibt count, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, Dichte = True) meine Zählungen in schwebenden Werten an, gemäß dem Beispiel, das Sie angegeben haben, wie zählen kann a sein schwebender Wert?
Dipen Gajjar
Bei der besten Antwort sollte berücksichtigt werden, dass eine signifikante Anzahl von Werten über der größten rechten Kante ignoriert wird. Fügen Sie immer Werte über der Gitterkante zum letzten Bin hinzu oder ändern Sie den zuletzt manuell erstellten binsWert in den Maximalwert im Array.
A.Ametov
@DipenGajjar Wenn Sie "Dichte = Wahr" weglassen, werden Sie das nicht sehen. Das Schlüsselwort "Dichte" gibt Ihnen ein "normalisiertes" Histogramm, in dem die Wahrscheinlichkeitsdichtefunktion dargestellt wird. Sie können darüber lesen Sie hier .
BUFU
66
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

Unten wird histangezeigt, dass sich 0 Elemente in Fach 0, 2 in Fach 1, 4 in Fach 3 und 1 in Fach 4 befinden.

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

bin_edges gibt an, dass Bin # 0 das Intervall [0,1) ist, Bin # 1 ist [1,2), ..., Bin # 3 ist [3,4).

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

Spielen Sie mit dem obigen Code, ändern Sie die Eingabe in np.histogramund sehen Sie, wie es funktioniert.


Aber ein Bild sagt mehr als tausend Worte:

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

Geben Sie hier die Bildbeschreibung ein

unutbu
quelle
4
Ich denke, das wäre genauer: plt.bar(bin_edges[:-1], hist, width=1)und plt.xlim(min(bin_edges), max(bin_edges))damit die Balken ihre erwartete Breite erreichen (andernfalls gibt es möglicherweise nur einen kleineren Behälter ohne dazwischen liegende Werte).
Bruno
Ist es möglich, das im obigen Numpy-Format erhaltene "hist" in der Funktion "plt.hist (...)" zu verwenden? Weil Sie es in der
Balkenmethode
7

Eine weitere nützliche Funktion numpy.histogrambesteht darin, die Ausgabe als x- und y-Koordinate auf einem Liniendiagramm darzustellen. Beispielsweise:

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()

Geben Sie hier die Bildbeschreibung ein

Dies kann eine nützliche Methode sein, um Histogramme zu visualisieren, bei denen Sie überall eine höhere Granularität ohne Balken wünschen. Sehr nützlich in Bildhistogrammen zur Identifizierung extremer Pixelwerte.

Grr
quelle
Dies ist sehr nützlich, um Bildzeilen- und -spaltenprojektionen anzuzeigen.
SKR