1

そんなある日を過ごしていると、何が起こっているのか頭を悩ませることができません。X、Y、Z座標の配列(Numpy配列)から2Dヒストグラムを生成するツールがあります(Zはその時点では重要ではありません)。さらに計算できるように、結果を正規化する必要があります。ただし、normed = Trueコマンドを使用する場合、配列の合計は常に0.000006前後になります。

ヒストグラム全体を正規化しようとしているので、すべての配列要素の合計は1になります。normedをFalseに設定すると、ビン内のサンプル数が正しく返されますが、これは明らかに正規化されていません。3k要素から30kまでの配列でテストしましたが、それでも同じ問題が発生します。記録のために、私のデータには3つの軸すべてのマイナス座標が含まれています。

コードは次のとおりです。

def histogrammer(coords):      # coords is a 3D numpy array

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0]), normed=True)
H.shape, xedges.shape, yedges.shape
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]]

global displayHistograms
if displayHistograms == True:
    print('Displaying:')
    plt.imshow(H, extent=extent, interpolation='nearest')
    plt.colorbar()
    plt.show()

print('{0:.30f}'.format(np.sum(H)))    # Debug normalisation

return H

このコードを2つの配列に対して実行し、2つの異なるヒストグラムを生成します。それぞれのprintステートメント:

0.000006250000000000000299510850
0.000006250000000000002840609692

誰かが私がどこで間違っているのかアドバイスできますか?助けてくれてありがとう!

4

2 に答える 2

4

normed=True体積(つまり、の合計binarea*binheight)を1、高さの合計ではなく、に正規化します。正規化されたヒストグラムは確率密度関数の推定値であるため、これが通常ヒストグラムを正規化する方法であるためです。

高さの合計を1にしたい場合は、正規化されていない値をポイントの総数で割るだけです。

H, xedges, yedges = np.histogram2d(coords[:,0], coords[:,1], bins=(50, 50), range=([-10000.0,10000.0],[-10000.0,10000.0]))
H_normalized = H/float(coords.shape[0])
于 2012-07-11T17:23:17.740 に答える
0

normed = Trueを設定すると、ビン内のアイテム全体の割合ではなく、ビン密度が得られます。これは、ビンの幅から、または手動で計算する必要があります。

于 2012-07-11T17:14:00.533 に答える