【问题标题】:Fast way to generate samples with np.random.choice()? [duplicate]使用 np.random.choice() 生成样本的快速方法? [复制]
【发布时间】:2019-04-27 12:48:02
【问题描述】:

我想生成随机样本而不替换N 次,如下所示:

import numpy as np

sample = np.zeros([100000, 4], int)
for i in range(100000):
    sample[i] = np.random.choice(128, 4, replace=False)

如果迭代变得非常大,整体采样将非常耗时。有什么方法可以加快采样速度?

【问题讨论】:

  • 所以,你想要二维数组,它的一个维度很大,另一个维度很小
  • 所以您想在一个维度上进行采样而不进行替换,但在另一个维度进行替换(或重复进行该采样)?

标签: python numpy random


【解决方案1】:

你的方法

In [16]: sample = np.zeros([100000, 4], int)

In [17]: %timeit for i in range(100000):sample[i] = np.random.choice(128, 4, rep
    ...: lace=False)
1 loop, best of 3: 2.5 s per loop

虽然你可以写:

In [149]: %timeit d=np.random.choice(128,100000);sample1=np.array([(d+x)%128 for x in np.random.choice(128,4)])
The slowest run took 4.63 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 4.11 ms per loop

这在我的机器上要快得多

这可能不太随机,但这取决于您的应用程序。 毕竟for 循环在香草 python 中非常慢。您可能对CythonNumba 感兴趣

【讨论】:

    【解决方案2】:

    这会给你一个随机的整数范围(0,128),形状为(100000,4)

    np.random.randint(128, size=(100000,4))
    

    【讨论】:

    • 这并不能保证不更换样品。
    【解决方案3】:

    使用random.sample 而不是np.random.choice

    In [16]: import time
        ...: start_time = time.time()
        ...: sample = np.zeros([100000, 4], int)
        ...: for i in range(100000):
        ...:     sample[i] = random.sample(range(128), 4)
        ...: print("--- %s seconds ---" % (time.time() - start_time))
        ...: 
    --- 0.7096474170684814 seconds ---
    
    In [17]: import time
        ...: start_time = time.time()
        ...: sample = np.zeros([100000, 4], int)
        ...: for i in range(100000):
        ...:     sample[i] = np.random.choice(128, 4, replace=False)
        ...: print("--- %s seconds ---" % (time.time() - start_time))
        ...: 
    --- 5.2036824226379395 seconds ---
    

    【讨论】:

    • 天哪。将timeit 用于计时运行时,但np.random.choice 并不意味着在循环中调用 - 您可以将shape 传递给它并调用它一次。这个时机真的没有多大意义。如果你运行一次,任何事情都会影响你的时间
    猜你喜欢
    • 2011-07-27
    • 2021-10-12
    • 2011-09-14
    • 2016-02-13
    • 1970-01-01
    • 2020-10-23
    • 2012-11-19
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多