发电机产生的数值的频率分析

时间:2014-12-09 22:45:01

标签: python python-3.x generator

我正在对图像进行一些分析,我有一个生成器可以为我提供图像中的所有像素:

def pixels_g(img):
    w, h = img.shape
    for y in range(0, h):
        for x in range(0, w):
            yield img[y][x]

如果转换为列表,则输出为

[0, 1, 2, 5, 240, 5, ... ]

现在我想为它获得“频率表”:

{
    0: 0,
    1: 5,
    2: 10,
    3: 0,
    4: 0,
    #snip
    255: 7
}

我在this question中找到了一些有用的选项,但它们都与list一起使用,我认为从我的生成器创建列表不是一个好主意 - 它可以有数百万元素

因此,我正在寻找一种方法来做到这一点,同时保留发电机的好处。我将处理许多图像,并且不想过多地占用资源。

1 个答案:

答案 0 :(得分:0)

使用来自"集合"的计数器。它适用于任何可迭代的,而不仅仅是列表。

from collections import Counter

pixels = pixels_g(img)
c = Counter(pixels)

print c[4]

如果您需要重复使用像素'的内容生成器实例在通过Counter运行后,使用&te;'来自itertools:

from collections import Counter
from itertools import tee

(pixels, hist) = tee(pixels_g(img))
c = Counter(pixels)
# can use hist for something else