【问题标题】:Python itertools create iterator of random subsetPython itertools 创建随机子集的迭代器
【发布时间】:2015-06-02 11:23:12
【问题描述】:

我有一个迭代器 itertools.combinations(big_matrix,50)big_matrix.shape = (65,x),所以大约有 10^14 种组合。我想获得 10000 个这种组合的随机子集,也作为迭代器,以节省内存。

我尝试了 itertools 配方

def random_combination(iterable, r):
  "Random selection from itertools.combinations(iterable, r)"
  pool = tuple(iterable)
  n = len(pool)
  indices = sorted(random.sample(xrange(n), r))
  return tuple(pool[i] for i in indices)

但是tuple(iterable) 创建了一个包含 10^14 个值的元组,并且该函数返回的不是迭代器而是一个数组。

random.sample不起作用,因为它无法获取itertools.combinations对象中的元素个数。

有什么办法吗?

【问题讨论】:

    标签: python random iterator itertools


    【解决方案1】:

    只产生随机组合,跟踪你以前见过的:

    def random_combinations(matrix, size):
        seen = set()
        n = len(matrix)
        while True:
            new_sample = tuple(sorted(random.sample(xrange(n), size)))
            if new_sample not in seen:
                seen.add(new_sample)
                yield tuple(matrix[i] for i in new_sample)
    

    遍历所有可能的组合以进行采样效率不高,您最终仍要测试所有 10^14 个组合。

    上述生成器每次迭代时都会选择一个随机组合;如果您需要某个数字,请使用循环或itertools.islice();选择 10 个随机组合将是:

    combinations_sample = list(islice(random_combinations(matrix, 50), 10))
    

    您可能误解了您找到的函数的作用;它的作用与我上面的函数大致相同,但只产生一个随机组合,而不跟踪之前产生的内容。你应该在 matrix 上使用它,而不是在 matrix 的所有组合上。

    【讨论】:

    • 我不明白你在做什么。您是自己创建组合吗?我在任何地方都没有看到itertools.combinations
    • @user3696412 是的,这会创建随机组合,而不是全部然后从中选择。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2019-01-13
    • 2015-08-02
    • 2012-03-04
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多