numpy(九)——随机函数
import numpy as np
生成标准正态分布下的随机数
np.random.normal(size=(3,3))
array([[ 0.33125546, -0.03813279, 1.68894202],
[ 1.73687994, 0.47303113, 0.14462729],
[ 1.01391194, 1.56574933, -0.91014962]])
当然,你也可以指定分布的均值和标准差。这样产生的随机数将不是标准正态分布下的样本值
np.random.normal(1,2,size=(3,4)) #均值为1,标准差为2
array([[ 2.43916315, 0.93752771, 1.26341829, 0.29229485],
[ 6.16909669, 4.44662107, -0.77711818, -2.03270126],
[ 0.4827822 , 2.10361979, 0.04770468, -2.18212697]])
randn方法和normal方法完全一致,也是产生标准正态分布下的随机样本值。不过,randn方法通用性更差一点,只能产生标准正态分布下的随机数样本值
np.random.randn(3,4)
array([[ 1.44784378, 0.52451147, -1.61612565, -1.75845933],
[-1.06777382, 0.6266391 , -0.29627549, -0.18429023],
[ 0.74290214, 1.86379803, 1.45410981, 0.14519321]])
[0,1)均匀分布下的随机数样本值生成
np.random.rand(3,4)
array([[ 0.7004642 , 0.64168043, 0.60636248, 0.682579 ],
[ 0.56245929, 0.70101596, 0.46811763, 0.15248406],
[ 0.59708816, 0.49116559, 0.15618211, 0.08860918]])
np.random.uniform方法也是生成均匀分布下的随机值,但是通用性更好,可以自定义均匀分布的区间
np.random.uniform(0,5,(3,4)) #[0,5)均匀分布下的值
array([[ 2.16644588, 0.63377488, 4.05355761, 3.76887509],
[ 0.49697361, 3.78121384, 1.82413589, 3.41500968],
[ 2.41906341, 3.96646679, 0.5711994 , 4.39522719]])
randint函数可以生成[a,b)区间内的随机整数
np.random.randint(2,10,(3,3))
array([[9, 6, 6],
[3, 5, 2],
[6, 3, 4]])
随机数种子可以保证生成的随机数值相同,numpy中有两种方式生成一个随机数种子
- 全局环境下的随机数种子
用seed方法可在全局的环境下生成一个随机数种子,全局的意思就是这颗种子是公用的,一旦生成,任何下一个随机函数都将使用这颗种子。而用完后种子就失效了,需要重新生成。
np.random.seed(1234)
np.random.normal(size=(3,3))
array([[ 0.47143516, -1.19097569, 1.43270697],
[-0.3126519 , -0.72058873, 0.88716294],
[ 0.85958841, -0.6365235 , 0.01569637]])
np.random.seed(1234)
np.random.normal(size=(3,3))
array([[ 0.47143516, -1.19097569, 1.43270697],
[-0.3126519 , -0.72058873, 0.88716294],
[ 0.85958841, -0.6365235 , 0.01569637]])
np.random.normal(size=(3,3))
array([[ -2.24268495e+00, 1.15003572e+00, 9.91946022e-01],
[ 9.53324128e-01, -2.02125482e+00, -3.34077366e-01],
[ 2.11836468e-03, 4.05453412e-01, 2.89091941e-01]])
- 面向对象环境下的随机数种子
与全局环境下的种子不同的是,RandomState方法返回一个种子对象,将生成的种子保存在该对象中。通过调用该种子对象上的随机数方法,才可以触发该种子。
要注意的是,即使将种子保存在一个对象中,该种子也只能被调用一次,第二次调用将会失效,而由另一个事先没有被规定的随机的种子代替执行随机函数
seed = np.random.RandomState(1234)
np.random.normal(size=(3,3))
array([[-0.39784023, 0.33743765, 1.04757857],
[ 1.04593826, 0.86371729, -0.12209157],
[ 0.12471295, -0.32279481, 0.84167471]])
seed.normal(size=(3,3))
array([[ 0.47143516, -1.19097569, 1.43270697],
[-0.3126519 , -0.72058873, 0.88716294],
[ 0.85958841, -0.6365235 , 0.01569637]])
seed.normal(size=(3,3)) #当再次调用原来的1234种子已经失效,因此产生的值发生了不同
array([[-1.81702723, -0.18310854, 1.05896919],
[-0.39784023, 0.33743765, 1.04757857],
[ 1.04593826, 0.86371729, -0.12209157]])
更多信息见《利用Python进行数据分析 第二版》P119