【问题标题】:Frequency analysis of values produced by generator生成器产生的值的频率分析
【发布时间】:2015-02-08 00:23:09
【问题描述】:

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

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 中找到了一些有用的选项,但它们都适用于列表,而且我认为从我的生成器创建列表并不是一个好主意 - 它可以有数百万个元素。

因此,我正在寻找一种方法来做到这一点,同时保留生成器的好处。我会处理很多图像,不想占用太多资源。

【问题讨论】:

  • 一个默认的字典,随手计算?
  • collections.counter 再次出击。这个问题肯定至少有十几个重复项。
  • @OlehPrypin 会将 collections.Counter 用作生成器吗?
  • 唯一的区别可能是它不保存零计数元素...

标签: python python-3.x generator


【解决方案1】:

使用“集合”中的计数器。它适用于任何可迭代对象,而不仅仅是列表。

from collections import Counter

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

print c[4]

如果您需要在通过 Counter 运行后重用“像素”生成器实例的内容,请使用 itertools 中的“tee”:

from collections import Counter
from itertools import tee

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

【讨论】:

  • 会消耗生成器的
  • 工作,除了我没有得到零缺失值。 dict.get(num, 0) 可能会处理它,我猜......但这是一个 hack
  • @PadraicCunningham 你是什么意思,消费?
  • 我的意思是,如果你在它上面调用计数器并尝试使用生成器,但你什么都得不到
  • @MightyPork Counter 对象已经为丢失的项目返回 0,因此不需要 .get()
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 2021-08-23
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多