如何使用n个条目对数组进行混洗而不生成范围(n)

时间:2013-06-28 13:20:06

标签: python numpy shuffle

所以,我正在看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变体也快得多。

2 个答案:

答案 0 :(得分: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)}将以极高的概率完成工作。

答案 1 :(得分:0)

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

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

Elazar的解决方案同样适用。