2012-02-04 1 views
90

numpyを読み上げているうちに、numpy.histogram()という関数が発生しました。numpy.histogram()はどのように機能しますか?

これはどのようなものですか。どのように動作しますか?ドキュメントには、ビン:彼らは何ですか?

グーグルが私をdefinition of Histograms in generalに導いてくれました。私はそれを得る。しかし、残念ながら、私はこの知識をドキュメントで与えられた例にリンクすることはできません。

答えて

121

ビンは、X軸に沿ったヒストグラムの単一バーの幅を表す範囲です。また、これをインターバルと呼ぶこともできます。 (ウィキペディアはそれらを「非独立カテゴリ」として正式に定義しています)

Numpy histogram関数はヒストグラムを描画しませんが、各ビン内の入力データの出現を計算します。ビンの幅が同じでない場合は高さが必要です)。この例では

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

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

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

ここではビンは幅が同じなので、各バーの高さにオカレンス数を使用できます。描かれたときは、あろう:

  • 範囲/ビンの高さ0のバー[0,1] X軸上に、
  • 範囲/ビンの高さ2のバーを[1,2] 、
  • 範囲/ bin [2,3]の高さ1の棒。あなたが直接matplotlibのでこれをプロットすることができ

は(そのhist機能もビンと値を返します):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() 

enter image description here

+4

プロットしたい場合は、[この回答](http://stackoverflow.com/a/5328669/372643)にも興味があります。 [Matplotlibはそれらを直接計算することもできます](http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist)。例[here](http://matplotlib.sourceforge.net/examples/api/histogram_demo.html)および[here](http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html)を参照してください。 – Bruno

+0

この回答をありがとう、それはちょうど私に大きな問題を救った! – AlexFZ

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

がビン#0の2項目、ビン#1の2項目、ビン#3の4項目、ビン#4の1項目です。

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

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

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

enter image description here

+3

バーを作るには、これはもっと正確です: 'plt.bar(bin_edges [: - 1]、hist、width = 1)'と 'plt.xlim(min(bin_edges)、max(bin_edges))'期待された幅に合う(そうでなければ、間に値のない小さなビンだけがあるかもしれない)。 – Bruno

+0

ブルーノ、ありがとう。それは確かに良いです。 – unutbu

0

numpy.histogramを行うには別の有用な事は、xとyはlinegraph上の座標として出力をプロットすることです。たとえば、次のように

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

enter image description here

これは、あなたがどこでもバーなしに粒度の高いレベルを希望のヒストグラムを視覚化するのに便利な方法です。極端なピクセル値を識別するための画像ヒストグラムで非常に便利です。

関連する問題