2013-02-05 9 views
0

我工作Think Python,並有一個exercise那裏你編寫執行以下功能:從頭開始構建一個水桶名單直方圖在Python

  • 取作爲參數:L(一號碼列表)和n(和INT)
  • 回報中的n子列表
    • 每個子列表表示由數字在L覆蓋的範圍的細分一個列表的形式的直方圖,幷包含一個int代表的L許多元素如何下跌在細分

所以,我們正在尋找一個範圍內的數字,切碎該範圍爲n等於桶,並建立與這些分組的直方圖。本練習之前的部分顯示了在處理區間[0.0,1.0)中的隨機浮點列表時,如何構建這樣的函數。它查看元素落在該區間中的位置(它只是它的值),將其乘以n,並將其轉換爲int(在進程中截斷)。這會在[0,n)中產生一個int,這是適當的桶索引。

這裏的區別在於我們沒有在預定的(方便的)時間間隔內工作。這是我想出來的。我想知道是否有更優雅的方式來做到這一點。我計算了我的間隔爲max(L) - min(L),但不得不增加一點額外的東西,否則L中的最大元素得到的索引是n(超出範圍),而應該取n-1。我稱這個小額外extraBit

def histogram(L, n): 
    hist = [0] * numBuckets 
    minVal = min(L) 
    maxVal = max(L) 
    extraBit = .0000000000001 
    interval = (maxVal - minVal) + extraBit 

    for i in L: 
     placement = (i - minVal)/interval 
     index = int(placement * numBuckets) 
     hist[index] = hist[index] + 1 

    return hist 

有沒有更漂亮的方法來做到這一點?

+0

漂亮會是縮進。 – RickyA

+0

你能具體嗎?我會分解它以提高可讀性,但我不知道這是否意味着什麼。 – ivan

+0

別人昨天修了... – RickyA

回答

2

我寫我自己最後一週:

def frequency_count(itt, nr_bins, minn=None, maxx=None): 
    ret = [] 
    if minn == None: 
     minn = min(itt) 
    if maxx == None: 
     maxx = max(itt) 
    binsize = (maxx - minn)/float(nr_bins) #man, do I hate int division 

    #construct bins 
    ret.append([float("-infinity"), minn, 0]) #-inf -> min 
    for x in range(0, nr_bins): 
     start = minn + x * binsize 
     ret.append([start, start+binsize, 0]) 
    ret.append([maxx, float("infinity"), 0]) #maxx -> inf 

    #assign items to bin 
    for item in itt: 
     for binn in ret: 
      if binn[0] <= item < binn[1]: 
       binn[2] += 1   
    return ret 

這一個允許你取的值,而不是整個範圍內的切片。它通過添加-inf-> min和max-> inf catchall bucket來修復溢出問題。我不知道這是否可以接受。

+0

這樣可以解決我的溢出問題,但是這個練習(我應該提到的)的目標之一是避免必須循環遍歷你檢查的每個元素的所有元素。這樣你可以執行len(itt)迭代而不是len(itt)* len(ret)。 – ivan

+0

有趣。我會再看看它,因爲我現在需要指定瓦片,這是相同的問題,但在2d。保持聯繫。 – RickyA

+0

今天我有一個科技手機屏幕w/Zalando這個問題,我的植入看起來幾乎相同。 – eggie5