2011-08-17 51 views
1

我想通過python製作直方圖。我從下面的片段開始:構建直方圖

def histogram(L): 
    d = {} 
    for x in L: 
     if x in d: 
      d[x] += 1 
     else: 
      d[x] = 1 
    return d 

我明白它是使用字典功能來解決問題。 但我對第四行感到困惑:if x in d:

d是要構建的,d中沒有任何東西,那麼如果x在d中怎麼來?

+0

如果您尋找直方圖,然後使用numpy/scipy或matplotlib中的直方圖函數。圖書館非常棒! – joaquin

回答

1

對於L中的每個元素,for循環內的代碼將被執行一次,其中x是當前元素的值。

讓我們看看簡單的情況,其中L是列表[3, 3]。第一次通過循環d將爲空,x將爲3,而3 in d將爲false,因此d[3]將設爲1.下一次通過循環x將再次爲3,並且3 in d將爲真,因此d[3]將會加1.

5

請記住,這iffor循環中。

所以,當你在L看,第一項是沒有在d,但是當你到下一個項目中L,有東西d,所以你需要檢查是否在柱狀圖上創建一個新倉(d[x] = 1),或將該項添加到現有倉(d[x] += 1)。

在Python中,我們其實有一些這方面的快捷鍵:

from collections import defaultdict 

def histogram(L): 
    d = defaultdict(int) 
    for x in L: 
     d[x] += 1 
return d 

這會自動在零開始在d每個倉(什麼int()回報),所以你不必檢查回收站存在。在Python 2.7版或更高版本:

from collections import Counter 

d = Counter(L) 

會自動在L每個項目的頻率的映射。不需要其他代碼。

1

我想其他人已經解釋了爲什麼if x in d。但這裏是一個線索,這個代碼應該怎麼寫下面的「不問的權限,請原諒」:

... 
    try: 
     d[x] += 1 
    except KeyError: 
     d[x] = 1 

這樣做的原因,是你想到這個錯誤只出現一次(至少一次每個方法調用)。因此,沒有必要檢查x in d

+1

'except'比'if'慢得多,但'try'更快 - 所以如果'如果x不在d'會相當頻繁地發生,最好徵求同意。當'KeyError'確實是__except__情況時,那麼你應該使用'try' /'except'並且請求原諒。 – agf

0

您可以使用例如matplotlib在Python中創建自己的直方圖。如果你想看到一個關於如何實現這個功能的例子,你可以參考this answer

enter image description here

在這種特定的情況下,你可以用做:

temperature = [4, 3, 1, 4, 6, 7, 8, 3, 1] 
radius  = [0, 2, 3, 4, 0, 1, 2, 10, 7] 
density  = [1, 10, 2, 24, 7, 10, 21, 102, 203] 

points, sub = hist3d_bubble(temperature, density, radius, bins=4) 
sub.axes.set_xlabel('temperature') 
sub.axes.set_ylabel('density') 
sub.axes.set_zlabel('radius') 
2

您可以創建一個字典理解直方圖:

histogram = {key: l.count(key) for key in set(L)} 
1

可以使用Counter,可用來自Python 2.7和Python 3.1+。

>>> # init empty counter 
>>> from collections import Counter 
>>> c = Counter() 

>>> # add a single sample to the histogram 
>>> c.update([4]) 
>>> # add several samples at once 
>>> c.update([4, 2, 2, 5]) 

>>> # print content 
>>> print c 

Counter({2: 2, 4: 2, 5: 1}) 

該模塊帶來了一些不錯的功能,如加法,減法,相交和計數器聯合。 Counter可以計算任何可以用作字典鍵的東西。