首页Python【Python数据分析】7...

【Python数据分析】7.伪随机数的生成


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————-————————————-

1.numpy.random模块

Numpy中的random模块可以很方便地生成多种概率分布下的数组。

numpy.random模块相对python内建的random模块更为高效(Python 的内置random模块一次只取一个值),因此,通过下面代码可以看到,在生成非常大的样本时两者所花费时间相差一个数量级。

Python 的内置随机模块一次只取一个值。正如你从这个基准中看到的,numpy.random在生成非常大的样本时,其速度远远超过一个数量级。

1>>> %timeit [normalvariate(0,1for _ in range(1_000_000)]
2840 ms ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
3
4>>> %timeit np.random.standard_normal(size=1_000_000)
526.8 ms ± 369 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

TIPS:

%time: 在行模式下,代码运行一次所花费的时间。

%%time:在单元模式下,代码运行一次所花费的时间。

%timeit: 在行模式下,执行代码块若干次,取最佳结果。

%%timeit: 在单元模式下,执行代码块若干次,取最佳结果。


行模式:只对紧跟其后的代码进行测试
单元模式:用于代码块的测试。

2.随机数生成器(Random Number Generator)

numpy.random模块生成的随机数被称为伪随机数,是由一个可配置的随机数生成器生成的。

在上面的代码中,numpy.random.standard_normal()函数使用了numpy.random模块中的默认随机数生成器。但是,在代码中也可以显式地配置生成器。

  • 首先需要先创建一个随机数生成器(Random Number Generator);

  • 然后再使用生成器(Generator)的函数方法生成随机数。

其中,seed参数决定了生成器的初始状态,每次使用rng对象生成数据时,其状态都会发生变化。

1>>> rng = np.random.default_rng(seed=123)
2
3>>> rng.standard_normal(size=3)
4array([-0.98912135, -0.36778665,  1.28792526])

3.随机数生成函数:

numpy.random模块中主要的随机数生成函数如下:

函数
说明
permutation() 返回一个序列的随机排列,或者返回一个乱序的整数范围序列
shuffle() 随机排列一个序列
rand() 服从[0,1)均匀分布的随机样本值
randint(low,high,size,dtype) 根据给定值,从低到高抽取随机整数
randn() 从均值为0方差为1的正态分布中抽取样本
normal(loc,scale,size) 从正态高斯分布中抽取样本
uniform(low,high,size) 从均匀[low,high)分布总抽取样本
binomial(n,p,size) 从二项分布中抽取样本
beta(a,b,size) 从beta分布中抽取样本
chisquare(df,size) 从卡方分布中抽取样本
gamma(shape, scale, size) 从伽马分布中抽取样本


  • permutation()、shuffle():

TIPS:

np.random.shuffle():在原数组上进行,改变自身序列,无返回值。np.random.permutation():不在原数组上进行,返回新的数组,不改变自身数组。

 1>>> arr = np.arange(12).reshape(3,4)
2>>> arr
3array([[ 0,  1,  2,  3],
4       [ 4,  5,  6,  7],
5       [ 8,  9, 10, 11]]
)
6
7>>> np.random.permutation(np.arange(10))
8array([4075831692])
9>>> arr
10array([[ 0,  1,  2,  3],
11       [ 4,  5,  6,  7],
12       [ 8,  9, 10, 11]]
)
 1>>> arr = np.arange(12).reshape(3,4)
2>>> arr
3array([[ 0,  1,  2,  3],
4       [ 4,  5,  6,  7],
5       [ 8,  9, 10, 11]]
)
6
7>>> np.random.shuffle(arr)
8>>> arr
9array([[ 8,  9, 10, 11],
10       [ 0,  1,  2,  3],
11       [ 4,  5,  6,  7]]
)
  • rand()、randint()、randn()、normal()、uniform():

 1>>> np.random.rand(2,3,4)
2array([[[0.46023842, 0.19317033, 0.2936925 , 0.81792751],
3        [0.55948738, 0.67792545, 0.80912668, 0.86857215],
4        [0.41799246, 0.05893816, 0.478459  , 0.52115943]]
,
5
6       [[0.58063202, 0.309199  , 0.91988263, 0.6553475 ],
7        [0.34924138, 0.54109404, 0.4490534 , 0.28232096],
8        [0.29587653, 0.56348098, 0.71519128, 0.51761868]]
])
9
10>>> np.random.randint(low=1,high=100,size=(2,3) , dtype=np.uint8)
11array([[76, 32, 91],
12       [11,  4, 76]]
, dtype=uint8)
13
14>>> np.random.randn(2,3)
15array([[-0.73521696,  0.50124899,  1.01273905],
16       [ 0.27874086, -1.37094847, -0.33247528]]
)
17
18>>> np.random.normal(loc=1,scale=10,size=(2,3))
19array([[ 20.59411342, -19.25045763,  -1.75786014],
20       [ -4.52108071,   2.20747363,   8.48215617]]
)
21
22>>> np.random.uniform(low=1,high=5,size=(2,3))
23array([[2.82964799, 4.01410396, 3.96744861],
24       [1.19431613, 3.83478958, 4.35697339]]
)
  • binomial()、beta()chisquare()gamma()
 1>>> np.random.binomial(n=20 ,p=0.5 , size=(2,3))
2array([[ 8, 12,  9],
3       [ 9, 11,  7]]
)
4
5>>> np.random.beta(10,20,(2,3))
6array([[0.36655283, 0.45592941, 0.40079304],
7       [0.28977561, 0.33336553, 0.32160162]]
)
8
9>>> np.random.chisquare(df=2, size=(23))
10array([[0.44978892, 3.33884668, 1.26217687],
11       [3.29987627, 0.01490818, 1.60410673]]
)
12
13>>> np.random.gamma(shape=3,scale=20,size=(2,3))
14array([[ 57.83147668,  79.80850879, 120.17752795],
15       [ 24.96820389,  25.88570086,  50.9173336 ]]
)


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments