当前位置: 首页 > 面试题库 >

Python直方图一线

袁宜民
2023-03-14
问题内容

有许多方法可以编写可计算直方图的Python程序。

所谓直方图,是指一个函数,该函数计算an中对象的出现iterable并在字典中输出计数。例如:

>>> L = 'abracadabra'
>>> histogram(L)
{'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2}

编写此函数的一种方法是:

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

有没有更简洁的编写此功能的方法?

如果我们在Python中具有字典理解功能,则可以编写:

>>> { x: L.count(x) for x in set(L) }

但是由于Python 2.6没有它们,我们必须编写:

>>> dict([(x, L.count(x)) for x in set(L)])

尽管此方法可能可读,但效率不高:L多次遍历。此外,这不适用于单寿命发电机。该功能对于迭代器生成器应同样有效,例如:

def gen(L):
    for x in L:
        yield x

我们可能会尝试使用reduce功能(RIP):

>>> reduce(lambda d,x: dict(d, x=d.get(x,0)+1), L, {}) # wrong!

糟糕,这行不通:键名是'x',不是x。:(

我以:

>>> reduce(lambda d,x: dict(d.items() + [(x, d.get(x, 0)+1)]), L, {})

(在Python 3中,我们将不得不编写list(d.items())而不是d.items(),但是这是假设的,因为那里没有reduce。)

请用更好的,更具可读性的单线打败我!;)


问题答案:

Python 3.x确实有reduce,您只需要做一个from functools import reduce。它还具有“
dict理解”,其语法与您的示例中的语法完全相同。

Python
2.7和3.x还具有一个Counter类,该类可以完全满足您的要求:

from collections import Counter
cnt = Counter("abracadabra")

在Python
2.6或更早版本中,我个人使用defaultdict并分两行进行:

d = defaultdict(int)
for x in xs: d[x] += 1

那是干净,高效,Python式的,对于大多数人而言,它比涉及任何东西都容易理解reduce



 类似资料:
  • 我使用matplotlib创建直方图。仍然有一些问题我自己或借助互联网无法解决。 > 如何更改某些垃圾箱的颜色?详细地说,我想用:a.)value bin更改箱子的颜色 如何不仅用1个小数点的数字标记X轴,而且用2个小数点标记X轴(现在只是不打印)? 请参见下面绘制的柱状图: plt。迄今为止的直方图

  • $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $fileHandle = $fileObject->getHandle(); ​ $chart = new \Vtif

  • 目标 在本章中,我们将学习查找和绘制2D直方图。这将在以后的章节中有所帮助。 介绍 在第一篇文章中,我们计算并绘制了一维直方图。 之所以称为一维,是因为我们仅考虑一个特征,即像素的灰度强度值。 但是在二维直方图中,您要考虑两个特征。 通常,它用于查找颜色直方图,其中两个特征是每个像素的色相和饱和度值。 已经有一个python示例(samples / python / color_histogram

  • 目标 在本节中, 我们将学习直方图均衡化的概念,并利用它来提高图像的对比度。 理论 考虑这样一个图像,它的像素值仅局限于某个特定的值范围。例如,较亮的图像将把所有像素限制在高值上。但是一幅好的图像会有来自图像所有区域的像素。因此,您需要将这个直方图拉伸到两端(如下图所示,来自wikipedia),这就是直方图均衡化的作用(简单来说)。这通常会提高图像的对比度。 我建议您阅读直方图均衡化上的Wiki

  • 在Python中,如何计算直方图的峰值? 我试过这个: 但结果是: 我希望它能找到0号和3号垃圾桶的峰值。 请注意,峰值跨越超过1个斌。我不希望它将跨度超过1列的峰视为额外的峰。 我对另一种获得高峰的方法持开放态度。 注:

  • 目标 在本章中,我们将学习直方图反投影。 理论 这是由Michael J. Swain和Dana H. Ballard在他们的论文《通过颜色直方图索引》中提出的。 用简单的话说是什么意思?它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。用更简单的话来说,与其余部分相比,输出图像将在可能有对象的区域具有