Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中从迭代器生成随机分区_Python_Random_Iterator_Partitioning - Fatal编程技术网

如何在Python中从迭代器生成随机分区

如何在Python中从迭代器生成随机分区,python,random,iterator,partitioning,Python,Random,Iterator,Partitioning,给定所需的分区数,分区大小应该几乎相等。处理列表的问题。它们不具有随机性,但也就是说。我的问题是,我有一个迭代器作为输入,所以shuffle不适用。原因是我想随机划分图的节点。该图可能非常大,因此我正在寻找一种解决方案,而不仅仅是创建一个中间列表 我的第一个想法是使用随机数函数作为选择器。但这只适用于两个分区。您只处理不同的分区,对吗 def dealer( iterator, size ): for item in iterator yield random.randr

给定所需的分区数,分区大小应该几乎相等。处理列表的问题。它们不具有随机性,但也就是说。我的问题是,我有一个迭代器作为输入,所以
shuffle
不适用。原因是我想随机划分图的节点。该图可能非常大,因此我正在寻找一种解决方案,而不仅仅是创建一个中间列表


我的第一个想法是使用随机数函数作为选择器。但这只适用于两个分区。

您只处理不同的分区,对吗

def dealer( iterator, size ):
    for item in iterator
        yield random.randrange( size ), item
这不会让您从将每个项分配到一个分区开始吗

然后你可以做一些类似的事情来制作列表。也许不是一件好事,但它展示了如何使用该函数

def make_lists( iterator, size ):
    the_lists = []*size
    for partition, item in dealer( iterator, size ):
        the_lists[partition].append(item)
    return the_lists

你可以创建一个k列表。当您收到一个值时,选择一个介于0和k-1之间的随机整数x,并将该值放入第x个列表中

每个列表平均包含N/k个元素,但标准偏差为√(N*1/k*(1-1/k))


通过根据每个分区中迄今为止生成的节点数调整权重,可以使列表的长度更加一致。如果选择一个函数,当(分区n中的节点数)>(节点数)/(分区数)时,它们的长度大致相等,即

重量[i]=最大值(节点/节点比例-节点数[i],0)

(max()用于停止负权重,如果您有4个节点和3个分区,则可能会发生这种情况。)

然后从1到总和(权重)(或0到总和(权重)-1)中选择一个随机数,并适当地选择分区


compress();类似于
(x==n表示随机分区数中的x)
,其中随机分区数是一个生成器。当然,您需要为每个分区复制随机的分区号。这种设计天生就比较慢,因为它需要遍历每个分区的节点列表。

“大小几乎相等”-因此,如果有1000个节点,我们想将其分为5部分,那么197195206 201 201是可以接受的,还是必须是200,200,200,200?@KennyTM:第一个可以接受。这用于k-fold交叉验证,因此可以接受一些偏差。您可以使用itertools中的groupby缩短第二部分。@wheaties:虽然为真,但不清楚分区的用途。您能给出标准偏差的来源或解释吗?@Space:这只是一个二项分布。
def random_partition(k, iterable):
  results = [[] for i in range(k)]
  for value in iterable:
    x = random.randrange(k)
    results[x].append(value)
  return results