Numpy 之 random

  Python 中可以使用 numpy.random 产生随机数,这里记录了相关的使用方法:

1
2
import numpy as np 
from __future__ import division

设定 seed

1
np.random.seed(seed=None)

返回 [0,1) 范围内的指定维度的数组(均匀分布)

1
2
3
4
5
6
7
8
np.random.rand(d0,d1,…,dn)

>>> np.random.rand(2)
array([0.30304177, 0.0649002 ])

>>> np.random.rand(2,2)
array([[0.08084478, 0.60007844],
[0.32630895, 0.64528464]])

返回指定维度的具有标准正态分布的数组

1
2
3
4
5
6
7
np.random.randn(d0,d1,…,dn)

a=np.random.rand(200000)
b=np.random.randn(200000)
a1=(a-a.mean())/(a.max()-a.min())
plt.hist(a1,bins=1000,density=True,color='g')
plt.hist(b, bins=1000,density=True,color='r')

返回 [low,high) 范围内的指定维度的整数数组,当 high 值未指定时,范围为 [0,low)

1
2
3
4
np.random.randint(low, high=None, size=None, dtype='l')

np.random.randint(0,3,size=2)
np.random.randint(0,3,size=(2,2))

返回 [0,1) 范围内指定维度的数组

1
2
3
4
5
np.random.rand(d0,d1,…,dn)
np.random.random_sample(size=None)
np.random.random(size=None)
np.random.ranf(size=None)
np.random.sample(size=None)

以一维数组 a 作为整体生成样本,replace 表示取样后是否放回,p 为一维数组,表示 a 中每一个元素对应的概率(权重)

1
2
3
4
5
6
7
np.random.choice(a, size=None, replace=True, p=None)

np.random.choice(np.arange(5),1)
np.random.choice(['a','b','c'],2)

a=np.random.choice(np.arange(5),20000,p=[0.3,0.1,0.3,0.1,0.2])
plt.hist(a, bins=5,density=True,color='r')

从特定的分布中提取样本

1
2
numpy.random.uniform(low=0.0, high=1.0, size=None)    # 从均匀分布 [low, high) 中生成样本
numpy.random.binomial(n, p, size=None) # 从二项分布中生成样本

其它更多的分布,可在手册中查询

例子(计算圆周率)

  在边长为 2R 的正方形内随机放置点,点距正方形中心的距离小于 R 的概率为 pi/4,故可计算出圆周率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np 
from __future__ import division

r=1
n=200000 # repeat number
p=2*np.random.random(size=(n,2))-1 # position
d=[np.sqrt(np.sum((p[i]-[0,0])**2)) for i in range(n)]
d=np.array(d)
print('Calculated Pi: %.9f'%(np.sum(d<1)/n*4))


x=[np.cos(i*2*np.pi/n) for i in range(n)]
y=[np.sin(i*2*np.pi/n) for i in range(n)]

plt.figure(figsize=(3,3))
plt.axis((-1,1,-1,1))
plt.scatter(p[:,0],p[:,1],s=0.09)
plt.scatter(x,y,s=0.09)