2

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

4

2 回答 2

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])

请注意,simple{randrange(n) for _ in range(m)}会以非常高的概率完成这项工作。

于 2013-06-28T14:09:47.487 回答
0

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

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

Elazar 的解决方案同样有效。

于 2013-07-01T15:03:42.940 回答