所以,我正在看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变体也快得多。
答案 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的解决方案同样适用。