小编h2k*_*ong的帖子

可以产生多个连续发电机吗?

以下是将可迭代项目拆分为子列表的两个函数.我相信这种类型的任务是多次编程的.我使用它们来解析由repr('result','case',123,4.56)和('dump',..)等行组成的日志文件.

我想改变这些,以便它们将产生迭代器而不是列表.因为列表可能会变得非常大,但我可以根据前几个项目决定接受或跳过它.此外,如果iter版本可用,我想嵌套它们,但这些列表版本会通过复制部分浪费一些内存.

但是从可迭代源中获取多个生成器对我来说并不容易,所以我请求帮助.如果可能的话,我希望避免引入新课程.

另外,如果您对这个问题有更好的标题,请告诉我.

谢谢!

def cleave_by_mark (stream, key_fn, end_with_mark=False):
    '''[f f t][t][f f] (true) [f f][t][t f f](false)'''
    buf = []
    for item in stream:
        if key_fn(item):
            if end_with_mark: buf.append(item)
            if buf: yield buf
            buf = []
            if end_with_mark: continue
        buf.append(item)
    if buf: yield buf

def cleave_by_change (stream, key_fn):
    '''[1 1 1][2 2][3][2 2 2 2]'''
    prev = None
    buf = []
    for item in stream:
        iden = key_fn(item)
        if prev is None: prev = iden
        if …
Run Code Online (Sandbox Code Playgroud)

python iterator yield generator

13
推荐指数
1
解决办法
5391
查看次数

如何选择常规密度的点

如何选择常规密度的点子集?更正式的,

特定

  1. 一组的不规则隔开的点,
  2. 距离度量dist(例如欧几里德距离),
  3. 和目标密度d,

如何选择满足以下条件的最小子集B

  • 每一个点X一个,
  • 存在一个点ÿ
  • 满足 dist(x,y) <= d

我目前的最佳镜头是

  • A本身开始
  • 选出最接近(或者只是特别接近)的几个点
  • 随机排除其中一个
  • 只要条件成立,就重复

并重复整个过程,以获得最好的运气.但有更好的方法吗?

我试图用280,000个18-D点来做到这一点,但我的问题是一般策略.所以我也想知道如何用二维点做到这一点.我并不需要保证最小的子集.欢迎任何有用的方法.谢谢.


自下而上的方法

  • 选择一个随机点
  • 选择未选中ymin(d(x,y) for x in selected)最大值
  • 继续!

我会把它称为自下而上和我最初自上而下发布的那个.这在开始时要快得多,所以对于稀疏采样,这应该更好吗?

性能指标

如果不要求保证最优性,我认为这两个指标可能有用:

  • 覆盖半径: max {y in unselected} min(d(x,y) for x in selected)
  • 经济半径: min {y in selected != x} min(d(x,y) for x in selected)

RC是最小允许d,并且这两者之间没有绝对的不等式.但RC <= RE更可取. …

algorithm geometry subset selection sampling

9
推荐指数
1
解决办法
697
查看次数