构建直方图

时间:2011-08-17 19:06:47

标签: python histogram

我正在尝试通过python制作直方图。我将从以下代码段开始:

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

我理解它使用字典功能来解决问题。 但我对第4行感到困惑:if x in d:

d是要构建的,d中还没有任何东西,那么如果x在d?

中怎么来

6 个答案:

答案 0 :(得分:5)

请注意,if位于for循环内。

因此,当您查看L中的第一项时,d中没有任何内容,但是当您到达L中的下一项时,是{/ 1}}中的某些内容,因此您需要检查是否在直方图上创建新的bin(d),或将该项添加到现有bin(d[x] = 1

在Python中,我们实际上有一些快捷方式:

d[x] += 1

这会自动启动from collections import defaultdict def histogram(L): d = defaultdict(int) for x in L: d[x] += 1 return d 中的每个bin为零(d返回的内容),因此您无需检查bin是否存在。在Python 2.7或更高版本上:

int()

将自动映射from collections import Counter d = Counter(L) 中每个项目的频率。无需其他代码。

答案 1 :(得分:2)

for循环中的代码将针对L中的每个元素执行一次,其中x是当前元素的值。

让我们看一下L是列表[3, 3]的简单情况。第一次循环d将为空,x将为3,3 in d将为false,因此d[3]将设置为1.下次通过循环x将再次为3,3 in d将为真,因此d[3]将增加1。

答案 2 :(得分:2)

您可以使用字典理解创建直方图:

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

答案 3 :(得分:1)

我认为其他人已经解释了为什么if x in d。但这里有一个线索,如何在“不要求许可,请求宽恕”之后编写这段代码:

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

原因是,您希望此错误仅出现一次(每次方法调用至少一次)。因此,无需检查x in d

答案 4 :(得分:0)

如果x不在d中,那么它将被放入d中,d [x] = 1.基本上,如果x多次出现在d中,则会增加与x匹配的数字。

尝试使用它来逐步执行代码:http://people.csail.mit.edu/pgbovine/python/

答案 5 :(得分: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')