2016-09-30 11 views
2

私は私が使用している別のソフトウェアの個々のインスタンスのリストに変換する必要があるヒストグラムを持っています: 「1」と3つのヒットの値が「2」の場合、私のリストは[1,1,1,1,2,2,2]となります。与えられた長さのリストを作成する - ヒストグラムを値のリストに変換する

ヒストグラムは、たとえば、histというリストにパックされた2つのnumpy配列として構成されています。 hist[1]の配列は私のビンのエッジを格納し、hist[0]の配列は各ビンのカウントを格納します。この変換を達成するための

非常に粗製の方法は、単純に次のコードを実行するために、次のようになります。

inhist=[] 
for i in range(len(hist[0])): 
    for j in xrange(int(hist[0][i])): 
     inhist.append(int(hist[1][i])) 

は、これを行うのより良い方法はありますか?特に、ヒストグラムが非常に大きくなると、おそらくこれを達成する最も効率的な方法ではありません。私が一定の価値を欲しがっている時間を正確に知っているのを見て、私は自分自身をすべて救うことができるのだろうかと思います。

私はこの全般を行うことがRAMを食べることを実感しますが、ひどく効率的ではありませんが、悲しいかな、現時点ではほとんど選択肢がありません。

EDIT: print hist戻り値:

[array([ 0.00000000e+00, 1.83413630e+07, 1.74493106e+09, 
      7.91390628e+10, 4.54474023e+11, 5.38810039e+11, 
      3.01718080e+11, 1.38440761e+11, 6.17865624e+10, 
      2.77457730e+10, 1.32412328e+10, 6.71579967e+09, 
      3.35556066e+09, 2.00513046e+09, 1.18435261e+09, 
      7.34440685e+08, 5.13846805e+08, 3.97894623e+08, 
      1.97770421e+08, 1.11546165e+08, 6.63624300e+07, 
      3.93196820e+07, 2.81038760e+07, 1.87733930e+07, 
      1.57307950e+07, 1.55162030e+07, 1.38710060e+07, 
      3.52969100e+06, 2.32881000e+05, 5.32210000e+04, 
      1.59100000e+04, 4.89700000e+03, 1.61300000e+03, 
      6.54000000e+02, 2.63000000e+02, 1.08000000e+02, 
      3.10000000e+01, 8.00000000e+00, 4.00000000e+00, 
      2.00000000e+00]), 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 
     34, 35, 36, 37, 38, 39, 40], dtype=uint64)] 

答えて

2

それらiインデックスは、基本的にその最初の配列hist[0]自体に存在する数だけ繰り返すhist[0]要素の数の長さの範囲の要素の範囲です。それらを使用して、2番目の配列hist[1]にインデックスを付けるだけで、望ましい出力が得られます。 repeat部分については、np.repeatを使用できます。

だから、私たちはそうのように、実装を持っているでしょう -

inhist = hist[1][np.arange(len(hist[0])).repeat(hist[0])] 

をnumpyのアレイオフ要素を追加する回避ベクトル化ソリューションなので、これはかなり効率的でなければなりません。

また、NumPy浮動小数点数の配列を使用している場合は、int dtypeに変換する必要があります。だから、hist[0].astype(int)フィードと出力があまりにもint DTYPEとして必要とされる場合には、そのように、それに同じ変換を使用する -

inhist = hist[1][np.arange(len(hist[0])).repeat(hist[0].astype(int))] 
+0

私は現在、エラー 'TypeError例外を取得:DTYPEからの配列データをキャストすることはできません(「のfloat64」 )をdtype( 'int64')に変更します。 'hist [0] .astype(int)'ビットを表示するようにコードを修正できますか? –

+0

@ P-M投稿を更新しました。 – Divakar

+0

それは私が思ったことです。私は今、メモリエラーが発生します: 'トレースバック(最近の呼び出し最後): ファイル" path_length_distribution.py "、行24、 inhist = hist [1] [np.arange(len(hist [0]) ).repeat(hist [0] .astype(int))] MemoryError' 何が考えられますか? –

関連する問題