Numpy 生成大量随机数的方法
当我们需要在python中生成大量随机数时,一般使用random模块进行,但是当生成的随机数量达到1000000时,这种方法会变得十分缓慢,此时我们可以使用NumPy库来提高效率。
NumPy库是一个用于处理大型多维数组和矩阵的基础库,它提供了高效操作数组的方法,同时还有大量的数学函数工具,这使得它成为数据科学和计算机视觉领域广泛使用的库。
在生成随机数方面,NumPy库提供了多种方法来生成不同分布的随机数,下文将详细介绍。
阅读更多:Numpy 教程
randint方法
randint方法可以用来生成均匀分布的随机整数。比如,我们希望生成100个从0到999之间的整数,可以使用以下代码:
import numpy as np
random_numbers = np.random.randint(0, 1000, size=100)
其中第一个参数表示生成的随机数范围的下界,第二个参数表示生成的随机数范围的上界,第三个参数size表示生成的随机数的数量。
同样,我们可以使用以下代码来生成1000000个从0到999之间的整数:
random_numbers = np.random.randint(0, 1000, size=1000000)
这个过程非常快,相较于使用random模块生成1000000个随机数,它的运行速度快了数倍。
random方法
random方法用于生成服从标准正态分布的随机数,函数原型如下:
numpy.random.standard_normal(size=None)
其中size表示生成的随机数的数量。比如,我们希望生成100个服从标准正态分布的随机数,可以使用以下代码:
random_numbers = np.random.standard_normal(size=100)
我们也可以使用以下代码来生成1000000个服从标准正态分布的随机数:
random_numbers = np.random.standard_normal(size=1000000)
这个过程同样非常快。
uniform方法
uniform方法用于生成均匀分布的随机数,函数原型如下:
numpy.random.uniform(low=0.0, high=1.0, size=None)
其中low表示生成的随机数范围的下界,high表示生成的随机数范围的上界。比如,我们希望生成100个在0到1之间的均匀分布的随机数:
random_numbers = np.random.uniform(low=0.0, high=1.0, size=100)
同样,我们可以使用以下代码来生成1000000个在0到1之间的均匀分布的随机数:
random_numbers = np.random.uniform(low=0.0, high=1.0, size=1000000)
normal方法
normal方法用于生成服从给定均值和标准差的正态分布的随机数,函数原型如下:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
其中loc表示所需均值,scale表示所需标准差。比如,我们希望生成100个均值为0,标准差为1的正态分布随机数:
random_numbers = np.random.normal(loc=0.0, scale=1.0, size=100)
同样,我们可以使用以下代码来生成1000000个均值为0,标准差为1的正态分布随机数:
random_numbers = np.random.normal(loc=0.0, scale=1.0, size=1000000)
使用时间比较各方法为了更加清晰地比较各种方法的效率,我们可以使用time模块来计时各方法的运行时间,以下是一个示例:
import numpy as np
import time
start_time = time.time()
random_numbers = np.random.randint(0, 1000, size=1000000)
print("Random numbers generated using randint: ", random_numbers[:10])
print("Time taken using randint: {} seconds".format(time.time() - start_time))
start_time = time.time()
random_numbers = np.random.standard_normal(size=1000000)
print("Random numbers generated using standard_normal: ", random_numbers[:10])
print("Time taken using standard_normal: {} seconds".format(time.time() - start_time))
start_time = time.time()
random_numbers = np.random.uniform(low=0.0, high=1.0, size=1000000)
print("Random numbers generated using uniform: ", random_numbers[:10])
print("Time taken using uniform: {} seconds".format(time.time() - start_time))
start_time = time.time()
random_numbers = np.random.normal(loc=0, scale=1, size=1000000)
print("Random numbers generated using normal: ", random_numbers[:10])
print("Time taken using normal: {} seconds".format(time.time() - start_time))
运行以上代码可得到如下结果:
Random numbers generated using randint: [654 93 703 269 691 538 116 416 431 269]
Time taken using randint: 0.015688180923461914 seconds
Random numbers generated using standard_normal: [ 0.44431239 -0.10980968 1.38157427 -0.43674704 -0.31155672 0.94037602
2.44108175 -0.46034363 -2.13588577 -0.76620657]
Time taken using standard_normal: 0.010708808898925781 seconds
Random numbers generated using uniform: [0.75124651 0.43035425 0.27194698 0.10978127 0.3769058 0.83110519
0.47468476 0.02075988 0.72008165 0.17730246]
Time taken using uniform: 0.019679784774780273 seconds
Random numbers generated using normal: [-1.2630294 0.73582884 1.27057478 0.56359407 -0.05042495 1.23222633
-0.30694498 -0.10706775 0.4109624 -1.07238657]
Time taken using normal: 0.011176109313964844 seconds
从上述输出结果来看,可以得出以下结论:
- 使用randint方法生成随机数的速度为0.015秒;
- 使用standard_normal方法生成随机数的速度为0.010秒;
- 使用uniform方法生成随机数的速度为0.019秒;
- 使用normal方法生成随机数的速度为0.011秒;
综合比较:在相同条件下,standard_normal方法生成随机数是最快的,randint方法和normal方法速度差不多,uniform方法速度最慢。
总结
本文介绍了NumPy库中四种生成随机数的方法,并且通过在相同条件下比较不同方法的速度,得出了它们的优劣。在对时间敏感的情况下,我们在生成大量随机数时可以优先选择速度更快的方法,以提高效率。使用NumPy库能够极大的减少生成随机数产生的时间开销,同时还有更高效的操作多维数组的方法,让我们在科学计算和数据处理领域更加得心应手。
极客教程