【发布时间】: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 非常低,所以一个简单的算法就足够了。随机序列的马尔可夫复杂度尽可能高。
-
我不知道你不能。我只这么想。但我敢肯定,你可以得到一些看起来随机的东西,或者是均匀分布的。
-
嗯,不是真的,复杂性在于随机数生成器,该调用会产生一些开销,但除此之外,实际实现一个不替换不会保留信息的采样器是微不足道的任何地方,并且会相对较快地完成。只需在零和向量大小之间取随机整数,如果重复则重新采样。如果您开始接近列表的大小,则效率会很低,否则。