2

希望のビン幅で、数値のリストを再ビン化することについて質問があります。これは基本的に頻度ヒストグラムが行うことですが、プロットは必要なく、ビン番号と各ビンの発生回数だけが必要です。

これまでのところ、自分のやりたいことを実行するコードをいくつか書きましたが、あまり効率的ではありません。list が与えられたa場合、3 に等しいビン幅で再ビン化するために、次のように記述しました。

import os, sys, math
import numpy as np

# list of numbers
a = list(range(3000))

# number of entries
L = int(len(a))

# desired bin width
W = 3

# number of bins with width W
N = int(L/W)

# definition of new empty array
a_rebin = np.zeros((N, 2))

# cycles to populate the new rebinned array
for n in range(0,N):
    k = 0
    for i in range(0,L):
        if a[i] >= (W*n) and a[i] < (W+W*n):
            k = k+1
    a_rebin[n]=[W*n,k]

# print
print a_rebin

さて、これはまさに私が望んでいることですが、ビンの数でリスト全体Nを何度も読み取るため、それほどスマートではないと思います。N小さなリストには問題ありません。しかし、非常に大きなリストとかなり小さなビン幅を扱わなければならないので、これは巨大な値に変換されN、プロセス全体に非常に長い時間 (数時間...) かかります。このコードを改善するアイデアはありますか? 前もって感謝します!

4

2 に答える 2

4

を使用する場合a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]、解決策は次のとおりです。

[[ 0. 3.]
[ 3. 3.]
[ 6. 3.]]

これをどう解釈しますか?間隔は 0..2、3..5、6..8? 何かが足りないと思います。

numpy.histogram() の使用

hist, bin_edges = numpy.histogram(a, bins=int(len(a)/W))
print(hist)
print(bin_edges)

出力:

[3 3 4]
[0.3.6.9.]

bin_edges には、0、3、6、および 9 の 4 つの値があります。最後の (最も右側の) ビンを除くすべてのビンは半分開いています。これは、[0,3)、[3,6)、および [6,9] の 3 つの間隔があり、各ビンに 3、3、および 4 つの要素があることを意味します。
独自のビンを定義できます。

import numpy
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bins=[0,1,2]
hist, bin_edges = numpy.histogram(a, bins=bins)
print(hist)
print(bin_edges)

出力:

[1 2]
[0 1 2]

[0 ,1) に 1 つの要素があり、[1,2] に 2 つの要素があります。

于 2016-08-04T17:07:48.470 に答える