2011-08-17 42 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可以计算任何可以用作字典键的东西。