【问题标题】:random sample in pythonpython中的随机样本
【发布时间】:2012-01-31 01:23:19
【问题描述】:

我想加快速度:

import random
ndim = 50000
for i in xrange(ndim):
   random.sample([j for j in xrange(ndim) if j != i], 30000)

我正在考虑使用 NumPy,但不知道如何使用。

【问题讨论】:

  • 您想出了哪些方法并尝试加快速度?
  • ndim的数量级是多少?
  • [j for j in xrange(ndim) if j != i]range(0,i)+range(i+1,ndim) 替换为 ndim=50000 大约快三倍。
  • 之后你会如何处理这些数字?
  • 我计算了一些数字。在相同的条件下(ndim = 50000,样本大小 = 30000,提取 5000 个样本,以保持简短),我建议的 NumPy 版本在我的计算机中运行大约 10 秒; Thomas Jung 提出的那个在大约 110 秒内完成,而使用 eumiro 建议的 range(i) + range(i+1, ndim) 大约需要大约 120 秒,因为它需要在每个循环中再次构建整个范围

标签: python performance random sample xrange


【解决方案1】:

来自NumPy Docs -

numpy.random.sample(size=None)

返回半开区间 [0.0, 1.0) 内的随机浮点数。

>>> np.random.random_sample()
0.47108547995356098
>>> np.random.random_sample((5,))
array([ 0.30220482,  0.86820401,  0.1654503 ,  0.11659149,  0.54323428])

所以如果你的ndim = 50000,那么你可以从上面得到一个随机样本并将其与ndim 相乘并将其四舍五入为一个整数。这可以工作...

【讨论】:

  • 很遗憾,这没有考虑到if j != i 部分。
  • 在我看来 OP 需要采样而不需要替换,这是标准库 random.sample 所做的;目前尚不清楚您将如何使用上述方法实现这一目标。
【解决方案2】:

使用 NumPy 的可能解决方案是:

import numpy as np
from numpy.random import randint

ndim  = 50000
mndim = ndim -1
base = np.arange(1, ndim)
# addr = np.ones(mndim, dtype=int)
# addr[0] = 0
for i in xrange(5000):
     base[randint(0, mndim, 30000)]
     try:
        base[i] = i
     except IndexError:
        pass

【讨论】:

  • Ahem...忘记了您可以使用数组索引 NumPy 数组...编辑后的将适用于旧版本:)
  • 已编辑以将 NumPy 解决方案与 @ThomasJung 使用的更新相结合。将运行时间缩短约 30%
  • 嗯。这不是一回事。 random.sample 进行抽样无替换:结果不会有重复的条目。您的base[randint(...)] 电话不会阻止重复输入。
  • 那么就需要测试numpy.random.choice,它允许在不替换的情况下进行采样,但这需要 NumPy >= 1.7.0
  • numpy.random.shuffle,所以你可以使用它,然后从中切出样本。 (我试过这个,但实际上得到的结果比random.sample慢。)
【解决方案3】:

使用允许值列表x 在使用后为下一轮更新:

import random
s = 3000
ndim = 5000

x = range(1, ndim)
for i in xrange(ndim):
   random.sample(x, s)
   if(i < ndim - 1): x[i] = i #update

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多