【问题标题】:How to shuffle an array with n entries without generating range(n)如何在不生成范围(n)的情况下对具有 n 个条目的数组进行洗牌
【发布时间】:2013-06-28 13:20:05
【问题描述】:

所以,我正在查看 python,我有一个大型 2d numpy 数据数组,我想获取这个大型数据矩阵的 m 行。我研究了 random.sample、numpy.random.shuffle 和 numpy.random.permutation,所有这些都有效,但通常它们会返回整个排列或至少生成整个范围(n)。如果我有一个非常大的数据集,那么做类似的事情

 data = numpy.random.uniform((n,100))
 myvec = data[random.sample(range(n),m),:]

将分配一个快速爆炸的向量范围(n)。所以我想我可以使用 xrange,它返回一个生成器,但是嘿,你不能只从生成器中获取任何元素,这不是它们的工作方式。

我试过了,效果很好。

 data = numpy.random.uniform((n,100))
 myvec = data[random.sample(xrange(n),m),:]

知道怎么做吗?

更新:

我可以使用

 samp = random.sample(range(n),10)

在出现内存错误之前,n 最多为 100000000。如果我使用

 samp = random.sample(xrange(n),10)

另一方面,我只是因为 int 与 C 的转换而开始出错,即 int 太长而无法转换为 C,大约为 1000000000。当然它只是 10 的因数,但我很好奇. xrange 变体也快得多。

【问题讨论】:

  • 信息应该保存在某个地方。
  • 什么意思?如果我没记错的话,xrange 会在调用 __next__() 函数时生成一个动态生成元素的对象。因此,当您调用它时,它不会将信息保存在任何地方。
  • 是的,但是这个信息的kolmogorov complexity 非常低,所以一个简单的算法就足够了。随机序列的马尔可夫复杂度尽可能高。
  • 我不知道你不能。我只这么想。但我敢肯定,你可以得到一些看起来随机的东西,或者是均匀分布的。
  • 嗯,不是真的,复杂性在于随机数生成器,该调用会产生一些开销,但除此之外,实际实现一个不替换不会保留信息的采样器是微不足道的任何地方,并且会相对较快地完成。只需在零和向量大小之间取随机整数,如果重复则重新采样。如果您开始接近列表的大小,则效率会很低,否则。

标签: python numpy shuffle


【解决方案1】:
def sample(n, m):
    d = set()
    while len(d) < m:
        d.add(randrange(n))
    return d

>>> sample(100000000000000000000000000000000000, 10)
set([5577049102993258248888250482046894L, 86044086231860190654588187118815513L, 2021737354726858669049814270580972L, 6253501639432326715043836478191628L, 5306460388221333758367322518700483L, 62195356583363524099133566314034473L, 376650426515181012918370326724858L, 80588135672357701239461833469588557L, 1978959860575617450893346333245569L, 41904683348442252013350548717573039L])

请注意,简单的{randrange(n) for _ in range(m)} 很有可能完成这项工作。

【讨论】:

    【解决方案2】:

    所以事实证明 xrange 和迭代器可以通过索引来访问,这正是 random.sample() 使用的。这就是它的工作原理。

    a = xrange(10)
    print a[5] #this works.
    

    Elazar 的解决方案同样有效。

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多