我想通过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