numpy.histogram()はどのように機能しますか?


120

numpyを読んでいるときに、関数に遭遇しましたnumpy.histogram()

それは何のために、どのように機能しますか?ドキュメントでは、ビンについて言及しています:それらは何ですか?

一部のグーグルによって、ヒストグラム定義が一般的になりました。わかった。しかし、残念ながら、この知識をドキュメントに記載されている例に関連付けることはできません。

回答:


167

ビンは、X軸に沿ったヒストグラムの1本の棒の幅を表す範囲です。これを間隔と呼ぶこともできます。(ウィキペディアでは、それらをより正式には「互いに素なカテゴリー」と定義しています。)

Numpy histogram関数はヒストグラムを描画しませんが、各ビンに含まれる入力データの発生を計算します。これにより、各バーの領域(ビンが同じ幅でない場合は必ずしも高さではない)が決定されます。

この例では:

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

3つのビンがあり、それぞれ0から1(除外1)、1から2(除外2)、および2から3(除外3)の範囲の値です。Numpyがこれらのビンを定義する方法は[0, 1, 2, 3]、この例で区切り文字()のリストを指定する場合ですが、何も指定されていない場合は入力からビンを自動的に選択できるため、結果にもビンが返されます。たとえばの場合bins=5、最小入力値と最大入力値の間の幅が等しい5つのビンを使用します。

入力値は1、2、1です。したがって、ビン "1 to 2"には2つのオカレンス(2つの1値)が含まれ、ビン "2 to 3"には1つのオカレンス(the 2)が含まれます。これらの結果は、返されるタプルの最初の項目にありますarray([0, 2, 1])

ここでのビンは同じ幅であるため、各バーの高さに出現数を使用できます。描かれると、次のようになります。

  • X軸の範囲/ビン[0,1]の高さ0のバー、
  • 範囲/ビンの高さ2のバー[1,2]、
  • 範囲/ビン[2,3]の高さ1のバー。

これをMatplotlibで直接プロットできます(このhist関数はビンと値も返します)。

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

ここに画像の説明を入力してください


8
それらをプロットしたい場合は、この答えに興味があるかもしれません。Matplotlibはそれらを直接計算することもできますここここの例を参照してください。
ブルーノ

アイリスの花のデータセットでは、counts、bin_edges = np.histogram(iris_setosa ['petal_length']、bins = 10、density = True)を使用すると、浮動小数点数で私のカウントが得られます。浮動値?
Dipen Gajjar

最良の答えは、最大の右端より上のかなりの数の値が無視されることを考慮に入れるべきです。常に格子の端より上の値を最後のビンに追加するか、最後に手動で作成したbins値を配列の最大値に変更します。
A.Ametov

@DipenGajjar「density = True」を省略した場合、それは表示されません。密度キーワードは、確率密度関数が表される「正規化された」ヒストグラムを提供します。あなたはそれについてここで読むことができます
BUFU

67
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

以下は、histビン#0に0個、ビン#1に2個、ビン#3に4個、ビン#4に1個のアイテムがあることを示しています。

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

bin_edges ビン#0が間隔[0,1)、ビン#1が[1,2)、...、ビン#3が[3,4)であることを示します。

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

上記のコードで遊んで、入力をに変更して、np.histogramどのように機能するかを確認してください。


しかし、絵は千の言葉に値します:

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

ここに画像の説明を入力してください


4
私はこれがより正確になると思います:plt.bar(bin_edges[:-1], hist, width=1)そしてplt.xlim(min(bin_edges), max(bin_edges))、バーを期待される幅に合わせるには(そうでなければ、値のない小さなビンがあるだけかもしれません)。
ブルーノ

上記のnumpy形式で取得した「hist」を「plt.hist(...)」関数で使用できますか?ここHISTで、唯一のx ..ありながらバー法では、あなたは、「Y」としてそれを供給するため
KBG

7

もう1つの便利なことnumpy.histogramは、出力を線グラフのx座標とy座標としてプロットすることです。例えば:

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

ここに画像の説明を入力してください

これは、どこにも棒なしでより高いレベルの粒度が必要な場合にヒストグラムを視覚化するのに便利な方法です。極端なピクセル値を識別するための画像ヒストグラムで非常に役立ちます。


これは、画像の行と列の投影を確認するのに非常に便利です。
SKR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.