最一般的方法是通过array
来构造:
import numpy as np np.array([1,2,3])
array([1, 2, 3])
下面讨论一些特殊数组的生成方式:
【a】等差序列:np.linspace
, np.arange
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
array([1. , 1.4, 1.8, 2.2, 2.6, 3. , 3.4, 3.8, 4.2, 4.6, 5. ])
np.arange(1,5,2) # 起始、终止(不包含)、步长
array([1, 3])
【b】特殊矩阵:zeros
, eye
, full
np.zeros((2,3)) # 传入元组表示各维度大小
array([[0., 0., 0.], [0., 0., 0.]])
np.eye(3) # 3*3的单位矩阵
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
np.eye(3, k=1) # 偏移主对角线1个单位的伪单位矩阵
array([[0., 1., 0.], [0., 0., 1.], [0., 0., 0.]])
np.full((2,3), 10) # 元组传入大小,10表示填充数值
array([[10, 10, 10], [10, 10, 10]])
np.full((2,3), [1,2,3]) # 每行填入相同的列表
array([[1, 2, 3], [1, 2, 3]])
【c】随机矩阵:np.random
最常用的随机生成函数为rand
, randn
, randint
, choice
,它们分别表示0-1均匀分布的随机数组、标准正态的随机数组、随机整数组和随机列表抽样:
np.random.rand(3) # 生成服从0-1均匀分布的三个随机数
array([0.92340835, 0.20019461, 0.40755472])
np.random.rand(3, 3) # 注意这里传入的不是元组,每个维度大小分开输入
array([[0.8012362 , 0.53154881, 0.05858554], [0.13103034, 0.18108091, 0.30253153], [0.00528884, 0.99402007, 0.36348797]])
对于服从区间a
到b
上的均匀分布可以如下生成:
a, b = 5, 15 (b - a) * np.random.rand(3) + a
array([6.59370831, 8.03865138, 9.19172546])
一般的,可以选择已有的库函数:
np.random.uniform(5, 15, 3)
array([11.26499636, 13.12311185, 6.00774156])
randn
生成了N(0,I)
的标准正态分布:
np.random.randn(3)
array([ 1.87000209, 1.19885561, -0.58802943])
np.random.randn(2, 2)
array([[-1.3642839 , -0.31497567], [-1.9452492 , -3.17272882]])
对于服从方差为\sigma^2均值为\mu的一元正态分布可以如下生成:
sigma, mu = 2.5, 3 mu + np.random.randn(3) * sigma
array([1.56024917, 0.22829486, 7.3764211 ])
同样的,也可选择从已有函数生成:
np.random.normal(3, 2.5, 3)
array([3.53517851, 5.3441269 , 3.51192744])
randint
可以指定生成随机整数的最小值最大值(不包含)和维度大小:
low, high, size = 5, 15, (2,2) # 生成5到14的随机整数 np.random.randint(low, high, size)
array([[ 5, 12], [14, 9]])
choice
可以从给定的列表中,以一定概率和方式抽取结果,当不指定概率时为均匀采样,默认抽取方式为有放回抽样:
my_list = ['a', 'b', 'c', 'd'] np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
array(['b', 'a'], dtype='<U1')
np.random.choice(my_list, (3,3))
array([['c', 'b', 'd'], ['d', 'a', 'd'], ['a', 'c', 'd']], dtype='<U1')
当返回的元素个数与原列表相同时,不放回抽样等价于使用permutation
函数,即打散原列表:
np.random.permutation(my_list)
array(['c', 'a', 'd', 'b'], dtype='<U1')
最后,需要提到的是随机种子,它能够固定随机数的输出结果:
np.random.seed(0) np.random.rand()
0.5488135039273248
np.random.seed(0) np.random.rand()
0.5488135039273248