我想通過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中怎麼來?
我想通過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中怎麼來?
對於L
中的每個元素,for
循環內的代碼將被執行一次,其中x
是當前元素的值。
讓我們看看簡單的情況,其中L
是列表[3, 3]
。第一次通過循環d
將爲空,x
將爲3,而3 in d
將爲false,因此d[3]
將設爲1.下一次通過循環x
將再次爲3,並且3 in d
將爲真,因此d[3]
將會加1.
如果x不在d中,那麼在d [x] = 1時將它放入d中。基本上,如果x多次出現在d中,它會增加與x匹配的數字。
嘗試使用此步驟通過代碼:http://people.csail.mit.edu/pgbovine/python/
請記住,這if
是for
循環中。
所以,當你在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
每個項目的頻率的映射。不需要其他代碼。
我想其他人已經解釋了爲什麼if x in d
。但這裏是一個線索,這個代碼應該怎麼寫下面的「不問的權限,請原諒」:
...
try:
d[x] += 1
except KeyError:
d[x] = 1
這樣做的原因,是你想到這個錯誤只出現一次(至少一次每個方法調用)。因此,沒有必要檢查x in d
。
'except'比'if'慢得多,但'try'更快 - 所以如果'如果x不在d'會相當頻繁地發生,最好徵求同意。當'KeyError'確實是__except__情況時,那麼你應該使用'try' /'except'並且請求原諒。 – agf
您可以使用例如matplotlib
在Python中創建自己的直方圖。如果你想看到一個關於如何實現這個功能的例子,你可以參考this answer。
在這種特定的情況下,你可以用做:
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')
您可以創建一個字典理解直方圖:
histogram = {key: l.count(key) for key in set(L)}
可以使用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
可以計算任何可以用作字典鍵的東西。
如果您尋找直方圖,然後使用numpy/scipy或matplotlib中的直方圖函數。圖書館非常棒! – joaquin