主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Pythonでヒストグラムを作る

                
tags:
 ある標本のデータ解析や画像処理をするときなど、平均値や分散が知りたくなり、ヒストグラムを作りたくなる。ヒストグラムを作るモジュールはいくつかあって、状況によって使い分けたほうがよさそうだと学んだ。

*ケース1.標本がすべて整数の場合: li = [9, 2, 6, 3, 4, 0, 10, 4, 10, 9]
 任意の数字の出現回数を調べたい。こんなとき、Python2.7以降ならCounter()を使って以下のように書ける。
from collections import Counter
>>> hist = Counter(li)
>>> hist
Counter({4: 2, 9: 2, 10: 2, 0: 1, 2: 1, 3: 1, 6: 1})

返ってくるオブジェクトは、辞書型と同様に扱える。

Pythonが2.6以前ならヒストグラムは次のように作る。
from collections import defaultdict
hist = defaultdict(int)
for x in li: hist[x] += 1

こちらも辞書型と同じように扱えるオブジェクトが返ってくる。なおこの方法は、リストでなく文字列を渡すことで、キャラクターの出現回数を数えるのにも使える。

 ちなみに、最大値を持つkeyが欲しければ以下の例がstackoverflowなどで見受けられる。。
max(hist, key = hist.get)
だけど上記だと、最大値を持つ要素が複数あっても、一つしか返ってこない。複数欲しければ以下。
max_val = max(hist.values())
[k for k, v in hist.iteritems() if v == max_val]


*ケース2.標本に小数が入っている場合: li_float = [8.0, 4.1, 2.9, 5.2, 6.2, 5.8, 5.0, 3.3, 1.8, 3.2]
 数学で使うような、まっとうなヒストグラムを書きたいときがある。標本に小数が入っている場合など。この標本をヒストグラム化するのに前述の方法を使うと、扱いづらいヒストグラムが返ってくる。
>>> hist = Counter(li_float)
>>> hist
Counter({1.8: 1, 5.8: 1, 5.0: 1, 3.2: 1, 8.0: 1, 5.2: 1, 2.9: 1, 6.2: 1, 3.3: 1, 4.1: 1})

こちらの場合はnumpy.histogramを使う。そうすれば、自分で横軸の間隔を定義でき、それに対応したヒストグラムが得られる。
>>> hist = numpy.histogram(li_float, xrange(math.ceil(max(li_float)) + 1))
>>> hist
(array([0, 1, 1, 2, 1, 3, 1, 0, 1, 0]),
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))

import numpy
import random
import math

li_float = [round(random.random() * 10, 1) for x in xrange(10)]
hist, r = numpy.histogram(li_float, bins=10, range=(0.0, 10.0))

print li_float
for num, deg in enumerate(hist):
print "%s <= x < %s: %s" %(r[num], r[num + 1], deg)


>>>
[2.0, 7.3, 5.7, 8.6, 9.3, 5.0, 3.7, 4.9, 4.2, 4.6]
0.0 <= x < 1.0: 0
1.0 <= x < 2.0: 0
2.0 <= x < 3.0: 1
3.0 <= x < 4.0: 1
4.0 <= x < 5.0: 3
5.0 <= x < 6.0: 2
6.0 <= x < 7.0: 0
7.0 <= x < 8.0: 1
8.0 <= x < 9.0: 1
9.0 <= x < 10.0: 1
            

コメントの投稿

非公開コメント

プロフィール

Matoba

Author:Matoba

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。