Numpy 生成大量随机数的方法

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)
Python

其中第一个参数表示生成的随机数范围的下界,第二个参数表示生成的随机数范围的上界,第三个参数size表示生成的随机数的数量。

同样,我们可以使用以下代码来生成1000000个从0到999之间的整数:

random_numbers = np.random.randint(0, 1000, size=1000000)
Python

这个过程非常快,相较于使用random模块生成1000000个随机数,它的运行速度快了数倍。

random方法

random方法用于生成服从标准正态分布的随机数,函数原型如下:

numpy.random.standard_normal(size=None)
Python

其中size表示生成的随机数的数量。比如,我们希望生成100个服从标准正态分布的随机数,可以使用以下代码:

random_numbers = np.random.standard_normal(size=100)
Python

我们也可以使用以下代码来生成1000000个服从标准正态分布的随机数:

random_numbers = np.random.standard_normal(size=1000000)
Python

这个过程同样非常快。

uniform方法

uniform方法用于生成均匀分布的随机数,函数原型如下:

numpy.random.uniform(low=0.0, high=1.0, size=None)
Python

其中low表示生成的随机数范围的下界,high表示生成的随机数范围的上界。比如,我们希望生成100个在0到1之间的均匀分布的随机数:

random_numbers = np.random.uniform(low=0.0, high=1.0, size=100)
Python

同样,我们可以使用以下代码来生成1000000个在0到1之间的均匀分布的随机数:

random_numbers = np.random.uniform(low=0.0, high=1.0, size=1000000)
Python

normal方法

normal方法用于生成服从给定均值和标准差的正态分布的随机数,函数原型如下:

numpy.random.normal(loc=0.0, scale=1.0, size=None)
Python

其中loc表示所需均值,scale表示所需标准差。比如,我们希望生成100个均值为0,标准差为1的正态分布随机数:

random_numbers = np.random.normal(loc=0.0, scale=1.0, size=100)
Python

同样,我们可以使用以下代码来生成1000000个均值为0,标准差为1的正态分布随机数:

random_numbers = np.random.normal(loc=0.0, scale=1.0, size=1000000)
Python

使用时间比较各方法为了更加清晰地比较各种方法的效率,我们可以使用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))
Python

运行以上代码可得到如下结果:

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
Python

从上述输出结果来看,可以得出以下结论:

  • 使用randint方法生成随机数的速度为0.015秒;
  • 使用standard_normal方法生成随机数的速度为0.010秒;
  • 使用uniform方法生成随机数的速度为0.019秒;
  • 使用normal方法生成随机数的速度为0.011秒;

综合比较:在相同条件下,standard_normal方法生成随机数是最快的,randint方法和normal方法速度差不多,uniform方法速度最慢。

总结

本文介绍了NumPy库中四种生成随机数的方法,并且通过在相同条件下比较不同方法的速度,得出了它们的优劣。在对时间敏感的情况下,我们在生成大量随机数时可以优先选择速度更快的方法,以提高效率。使用NumPy库能够极大的减少生成随机数产生的时间开销,同时还有更高效的操作多维数组的方法,让我们在科学计算和数据处理领域更加得心应手。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册