python科学计算5 ndarray对象在统计学中的应用,理论
1.随机数应用
1.1 生成随机数数组
下表中的d0,d1,d2…dn都表示的是第几个维度上的长度
函数 | 说明 |
---|---|
rand(d0,d1,…,dn) | 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 |
randn(d0,d1,…,dn) | 根据d0‐dn创建随机数数组,标准正态分布 |
randint(low[,high,shape]) | 根据shape创建随机整数或整数数组,范围是[low, high) |
seed(s) | 随机数种子,s是给定的种子值 |
1.指定shape获得随机数组
#0~1的均匀分布
print(rd.rand(2,3))
#标准正态分布
print(rd.randn(2,3))
[[0.38286511 0.2248728 0.1146488 ]
[0.58301705 0.23264106 0.55651819]]
[[-2.16145292 0.34531329 0.87896938]
[ 0.56276301 0.28843534 -1.0064815 ]]
2.randint函数
这个函数类似于range,不指定第一个参数默认从0开始,不指定最后一个参数默认创建单个随机数。
#给定范围的均匀分布
print(rd.randint(6))#产生单个值
print(rd.randint(10,50,(2,3)))
3.指定随机数种子,计算机获取随机数也是有规律的,他通过随机数种子通过某种随机算法的计算,从而获得随机数。随机数种子默认是计算机的时间。因此,我们就会感到随机数真的很随机。但是,当我们手动给他随机种子的时候,他的下一次随机数结果就会确定下来。因此,可以在测试的时候给定随机数种子,从而实现代码的观察,判断处理是否正确.
rd.seed(10)
print(rd.rand(2,3))
rd.seed(10)
print(rd.rand(2,3))
[[0.77132064 0.02075195 0.63364823]
[0.74880388 0.49850701 0.22479665]]
[[0.77132064 0.02075195 0.63364823]
[0.74880388 0.49850701 0.22479665]]
1.2 已知随机数数组,打乱顺序
函数 | 说明 |
---|---|
shuffle(a) | 根据数组a的第1轴进行随排列,改变数组x |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变数组x |
choice(a[,size,replace,p]) | 从一维数组a中以概率p(p也是一个数组,并且形状需要与a相同,默认被抽取的概率相同)抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False |
import numpy as np
a=np.arange(20).reshape(4,5)
#1,把数组的第一个轴进行排列
print(a)
print(rd.permutation(a))#生成一个新的数组
print(rd.shuffle(a))#改变数组a,返回空值
print(a)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[15 16 17 18 19]
[ 0 1 2 3 4]
[10 11 12 13 14]
[ 5 6 7 8 9]]
None
[[15 16 17 18 19]
[10 11 12 13 14]
[ 0 1 2 3 4]
[ 5 6 7 8 9]]
2.choice函数。
实现一个数字越大抽取概率越大的数组
#2.根据给出的一维数组来创建
b=a.flatten()#把多维数组降维成为一维数组
print(rd.choice(b,(2,3),replace=True,p=b/np.sum(b)))
[[16 13 9]
[15 11 4]]
1.3 根据特定概率获得数组元素
函数 | 说明 |
---|---|
uniform(low,high,size) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
normal(loc,scale,size) | 产生具有正态分布的数组,loc均值,scale标准差,size形状 |
poisson(lam,size) | 产生具有泊松分布的数组,lam随机事件发生率,size形状 |
2.统计函数
1.找出单个元素
函数 | 说明 |
---|---|
min(a) max(a) | 计算数组a中元素的最小值、最大值 |
argmin(a) argmax(a) | 计算数组a中元素最小值、最大值的降一维后下标 |
unravel_index(index, shape) | 根据shape将一维下标index转换成多维下标 |
ptp(a) | 计算数组a中元素最大值与最小值的差 |
median(a) | 计算数组a中元素的中位数(中值) |
2.求统计后的某个值,如果不给顶轴,则取所有元素的对应的值。
函数 | 说明 |
---|---|
sum(a, axis=None) | 根据给定轴axis计算数组a相关元素之和,axis整数或元组 |
mean(a, axis=None) | 根据给定轴axis计算数组a相关元素的期望,axis整数或元组 |
average(a,axis=None,weights=None) | 根据给定轴axis计算数组a相关元素的加权平均值 |
std(a, axis=None) | 根据给定轴axis计算数组a相关元素的标准差 |
var(a, axis=None) | 根据给定轴axis计算数组a相关元素的方差 |
a=np.random.randint(0,20,(3,5))
print(a)
print(np.sum(a))
print(np.sum(a,1))
print(np.sum(a,0))
[[ 0 9 4 5 7]
[ 4 11 11 4 17]
[ 3 7 6 2 11]]
101
[25 47 29]
[ 7 27 21 11 35]
分别表示在平行于第1个维度(在哪个维度上操作,就在框平行于轴,把平行于这个轴上的一组数据当作一个操作集)
在第0维度取值,平行于第0个维度
3.梯度
在连续的函数里,梯度就是每个点的斜率,斜率构成的函数就是原函数的导数
函数 | 说明 |
---|---|
np.gradient(f) | 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 |
1.一维数组的梯度
import numpy as np
a=np.random.randint(0,20,(5))#一个五个元素的一维数组
print(a)
print(np.gradient(a))#梯度值
#开头第二个-第一个元素/1
#结尾最后一个-倒数第二个元素/1
#中间的我的前一个元素-我的后一个元素/2
[13 8 9 5 0]
[-5. -2. -1.5 -4.5 -5. ]
来我们分析一下,下标为0的这样计算(8-13)/1=-5。下标为1(9-13)/2=-2.。下标为2的(5-8)/2=-1.5,下标为3的(0-9)/2=-4.5,下标为4的(0-5)/1=-5。中间的元素计算方法都想同年,第一个和最后一个元素计算方法有所差别
2.多维数组的梯度
print(a)
#返回的是一个列表
print(type(np.gradient(a)))
print(np.gradient(a))
返回的是一个列表,列表中下标为i,表示在第几个维度上取梯度
<class 'list'>
[array([[ -3. , 17. , 5. , 12. , 15. ],
[ 5. , 3. , -4.5, 3. , 4. ],
[ 13. , -11. , -14. , -6. , -7. ]]), array([[ -6. , 3. , 0. , -5.5, 1. ],
[ 14. , 7. , -2.5, -0.5, 4. ],
[-10. , -6.5, 0. , 3. , 3. ]])]
先在第0维度上取梯度
再第1维度上取梯度