2

巨大なリストを作成した、ヒストグラムを塗りつぶしたくない場合があります。DBを読み取り、イベントごとにヒストグラムイベントを埋めたいとします。例えば:

collection = db["my_collection"]
for event in collection.find():
   histogram.fill(event['a_number'])

したがって、コレクションに100億のエントリがある場合、すべてのデータをメモリに保存しなくても、分析に必要なヒストグラムを埋めることができます。

私はこれを独自のfill_histogram関数の作成で行いましたが、すぐに使用できるものがあるはずです...1980年代に開発されたHBOOKFORTRANライブラリには、これまでで最も使用されたサブルーチンとして「HFILL」がありました:)

ところで、これはnumpy.histogramの仕事をする関数ですが、numpyで見つかりませんでした:

def hfill(histogram, datum, weight=1):
'''
Bin the right bin in a numpy histogram for datum, with weight.
If datum is outside histogram's bins' range, histogram does not change
'''
for idx, b in enumerate(histogram[1]):
    if idx > 0:
        if (datum < b and datum >= histogram[1][0]) or (datum <= b and idx == len(histogram[1]) - 1):
            histogram[0][idx - 1] += int(weight)
            break
4

3 に答える 3

2

このメッセージは少し前に投稿されたものですが、HBOOK/PAW と同じように、あなたが行っていることに役立つツールについて言及したいと思います。大量のメモリ不足データを処理するための優れた Python の代替手段は他に見つかりませんでした。

  • PyROOT は ROOT フレームワーク全体を Python に公開するため、たとえばその TH1/2/3 および THnSparse バリアントを使用できます ( http://root.cern.ch/drupal/content/pyrootおよび一般的な ROOT ドキュメントを参照)。Python をサポートする ROOT をインストールし、何らかのタイプの「イベント」 (膨大なデータ セット用に最適化された ROOT の TTree/TChain など) があると仮定すると、イベントごとの充填は次のようになります。

    from ROOT import TH1F
    nbins, lo, hi = 100, -3, 3
    hist = TH1F('hist', 'my hist', nbins, lo, hi)
    for evt in events:
        hist.Fill(evt.somevalue)
    # render the histogram on a TCanvas (active if present, new otherwise)
    hist.Draw()
    
  • rootpy は、ROOT インターフェースをさらに「Python化」します ( http://rootpy.orgを参照)。上記と同じ仮定に加えて、rootpy がインストールされているという仮定の下では、上記のスニペットの最初の 2 行のみが次のように変更されます。

    from rootpy.plotting import Hist
    hist = Hist(nbins, lo, hi)
    

私は ROOT と PyROOT を長い間使用してきましたが、最近、いくつかの SciPy ツールとの統合を改善するために rootpy を試しました。rootpy と matplotlib の統合も優れています。特に、ヒストグラムを IPython ノートブックに表示する場合は、次のようになります。

from rootpy.plotting import Hist
import rootpy.plotting.root2matplotlib as rplt
import matplotlib.pyplot as plt

hist = Hist(100, -3, 3)
hist.FillRandom('gaus')
fig = plt.figure(figsize=(7, 5), dpi=100, facecolor='white')
rplt.errorbar(hist, xerr=False, emptybins=False)
plt.show()

上記のスニペットは、ROOt、PyROOT、rootpy、および matplotlib がインストールされているかどうかを確認するための最小限のテストとして機能します。

于 2013-06-06T16:59:18.550 に答える
0

簡単な例を次に示します。

>>> c = Counter()
>>> for j in xrange(10):
...   c[j] = j**2
>>> c
Counter({9: 81, 8: 64, 7: 49, 6: 36, 5: 25, 4: 16, 3: 9, 2: 4, 1: 1, 0: 0})

ここでは、整数のメモリ内リストを保持する必要はありません。numpy確かに、ヒストグラムを配列として持ちたい場合は、Counter手動で作成する必要があります。

Python < 2.7 を使用している場合は、Counterからは利用できませんがcollectionsActiveState のレシピは次のとおりです。

于 2012-11-14T11:49:57.653 に答える