Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用np.random.choice()快速生成样本的方法?_Python_Numpy_Random - Fatal编程技术网

Python 使用np.random.choice()快速生成样本的方法?

Python 使用np.random.choice()快速生成样本的方法?,python,numpy,random,Python,Numpy,Random,我想生成随机样本,不替换N次,如下所示: 将numpy导入为np 样本=np.零([100000,4],整数) 对于范围内的i(100000): 样本[i]=np.random.choice(128,4,replace=False) 如果迭代变得非常大,则整个采样将非常耗时。有没有办法加快此采样速度?这将为您提供形状(100000,4)中的随机整数范围(0128) 使用random.sample代替np.random.choice In [16]: import time ...: s

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

将numpy导入为np
样本=np.零([100000,4],整数)
对于范围内的i(100000):
样本[i]=np.random.choice(128,4,replace=False)

如果迭代变得非常大,则整个采样将非常耗时。有没有办法加快此采样速度?

这将为您提供形状(100000,4)中的随机整数范围(0128)


使用
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 ---
你的方法

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中非常慢。你可能对这篇文章感兴趣,或者

锁定这篇文章:所以,你想要2D数组,它的一个维度很大,而另一个维度很小,所以你想在一个维度中不替换样本,但在另一个维度中替换样本(或者重复进行该样本)?哦,伙计。使用
timeit
计时运行时,但是
np.random.choice
并不意味着要在循环中调用-您可以将
形状
传递给它并调用一次。这个时机真的没有多大意义。如果你只运行一次,任何东西都会影响你的计时,但这并不能保证在没有替换的情况下采样。
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