2016-09-30 28 views
2

我有一個直方圖,需要將其轉換爲我正在使用的另一個軟件的單個實例的列表:如果我有四個匹配值的「1」和三個命中的值爲「2」,那麼我的列表將需要讀取[1,1,1,1,2,2,2]使用給定值創建給定長度的列表 - 將直方圖轉換爲值列表

我的直方圖被構造成兩個numpy陣列,打包到名爲hist的列表中。 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])) 

是否有這樣做的更好的辦法?特別是當直方圖變得非常大時,這可能不是實現這一點的最有效方式。看到我確切知道有多少次我想要一定的價值,我想知道我是否可以拯救自己所有的循環?

我意識到做這件事一般會吃內存,效率不是很高,但是,唉,我目前沒有什麼選擇。

編輯: 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]元素的數目的長度的範圍內。使用我們簡單地索引到第二個數組hist[1]給我們所需的輸出。對於repeat部分,我們可以使用np.repeat

因此,我們將有一個實現,像這樣 -

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

作爲一個量化的解決方案,避免了追加過NumPy的數組中的元素,這應該是相當有效的。另外,如果我們正在處理浮點數的NumPy數組,我們可能需要將dtype轉換爲int。因此,飼料中hist[0].astype(int)如果輸出需要爲int D類也使用它相同的轉換,像這樣 -

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

我目前得到的錯誤'類型錯誤:無法從D(「float64」投陣列數據)根據規則'safe''轉換爲dtype('int64')。你能修改代碼來顯示'hist [0] .astype(int)'位嗎? –

+0

@ P-M更新了帖子。 – Divakar

+0

好的,這就是我的想法。我現在得到一個內存錯誤: 'Traceback(最近調用最後一個): 文件「path_length_distribution.py」,第24行,在 inhist = hist [1] [np.arange(len(hist [0])) ).repeat(hist [0] .astype(int))] MemoryError' 任何想法爲什麼? –

相關問題