2016-08-04 6 views
0

数字のリストを必要なビン幅で再作成することについて質問がありました。これは基本的に周波数ヒストグラムですが、プロットは必要ありません。ビン番号と各ビンの発生回数だけは必要ありません。Pythonで数字のリストを再構築する

これまでのところ、私が欲しいことをするコードを書いていますが、あまり効率的ではありません。 、3に等しいビン幅でそれをREBINするためには、リストaを考えると、私は次のように書いた:

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の巨大な値に変換され、プロセス全体には非常に長い時間(時間)がかかります。このコードを改善するためのアイデアはありますか?前もって感謝します!

答えて

1

あなたがa = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]を使用している場合は、あなたのソリューションは、次のとおりです。

どう

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

あなたはこれを解釈しますか?間隔は0..2,3.5.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]

我々は4つの値を有しますbin_edges:0、3、6、および9。最後(右端)のビンを除くすべてのビンは半開です。 3つの区間[0,3]、[3,6]、[6,9]があり、各ビンに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)と2要素で1つの要素を持っています[ 1,2]。

+0

はい、私のアルゴリズムは最後のビンを逃しますが、あなたのソリューションは最後の2つのビンをマージします。 binwidthが3の[0,1,2,3,4,5,6,7,8,9]の場合は、[3,3,3,1]として出現が予想されますが、[3,3,4 ]。私がbindwithを選択した場合、私は[5,5]のような出現を期待していますが、このコードは、私が理解できないbinの辺を与えています。[0. 4.5 9.] ...残念ですが、 ... – urgeo

+0

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

0

Numpyにはnp.histogramと呼ばれる方法があります。それはまたかなり良いスケールです。

関連する問題