十一月组队学习:numpy统计相关

numpy中关于统计的各种函数

今天的内容比较简单:以下x均为数组(一维或以上)
整体内容:
1.最大值:np.max(x,axis=None)
2.最小值:np.min(x,axis=None)
3.极差:np.ptp(x,axi=Nones)
4.分位数:np.percentile(x,分位数,axis=None),分位数可以是一个列表,如[0,25,75]
5.中位数:np.median(x,axis=None) 与 np.percentile(x,50,axis)等价
6.均值:np.mean(x,axis=None)
7.加权平均值:np.average(x,axis=None,weights),当weights默认时,与np.mean()等价
8.方差:np.var(a,axis=None,ddof=0),当ddof=0时,分母为n,当ddof=1时,分母为n-1(即方差的无偏估计)
9.标准差:np.std(a,axis=None,ddof=0)就是方差的算术平方根
10.样本(协)方差:np.cov(x,y=None),np.cov(x)等同于np.vax(x,ddof=1)!【这里是难点!】
11.相关系数矩阵:np.corrcoef(x,y)。只能算2个数组的相关系数,作用很有限!
12.numpy.digitize(x, bins, right=False)函数功能:返回一个和x形状相同的数据,返回值中的元素为对应x位置的元素落在bins中区间的索引号。

具体代码:

#每新建一个工程都要设置一下anaconda环境以及把use IPython if available去掉

#最大值和最小值:np.amin(x,axis),np.amax(x,axis)
import numpy as np
np.random.seed(123)
x = np.random.uniform(5, 10, size=(5, 4))
np.set_printoptions(precision=1)
print(x)
# [[8.5 6.4 6.1 7.8]
#  [8.6 7.1 9.9 8.4]
#  [7.4 7.  6.7 8.6]
#  [7.2 5.3 7.  8.7]
#  [5.9 5.9 7.7 7.7]]

#所有值的最小值
print(np.amin(x)) #5.298389483047842
print(np.amin(x).dtype) #float64
print(type(np.amin(x))) #<class 'numpy.float64'>
#每列的最小值
print(np.amin(x, axis=0)) #[5.9 5.3 6.1 7.7]
print(np.amin(x, axis=0).dtype) #float64
print(type(np.amin(x, axis=0))) #<class 'numpy.ndarray'>
#每行的最小值
print(np.amin(x, axis=1)) #[6.1 7.1 6.7 5.3 5.9]
print(np.amin(x, axis=1).dtype) #float64
print(type(np.amin(x, axis=1))) #<class 'numpy.ndarray'>
#最大值np.amax()类似,不重复写了。
#————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#极差:np.ptp(x,axis)
x = np.random.randint(20, 50, size=(3, 4))
print(x)
# [[44 49 36 27]
#  [29 23 48 48]
#  [40 26 21 41]]
print(np.ptp(x)) #28  (49-21)
print(np.ptp(x, axis=0)) #[15 26 27 21]
print(np.ptp(x, axis=1)) #[22 25 20]
#——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#分位数:np.percentile(x,分位数,axis)
x = np.random.randint(0, 30, size=(3, 5))
print(x)
# [[22 27  2  1 12]
#  [ 8  3 10  5  0]
#  [11  2 26 10 22]]
print(np.percentile(x, 25))#2.5
print(np.percentile(x, [25,50]))#[ 2.5 10. ]
print(np.percentile(x, [0,25,50,75]))#  [ 0.   2.5 10.  17. ]
print(np.percentile(x, [0,25,50,75, 100]))#[ 0.   2.5 10.  17.  27. ]

print(np.percentile(x, 25,axis=0))
#[9.5 2.5 6.  3.  6. ]
print(np.percentile(x, [25,50],axis=0))
#[[ 9.5  2.5  6.   3.   6. ]
# [11.   3.  10.   5.  12. ]]
print(np.percentile(x, 25,axis=1))
#[ 2.  3. 10.]
print(np.percentile(x, [25,50],axis=1))
#这里有点绕,不符合常识
# [[ 2.  3. 10.]
#  [12.  5. 11.]]
#——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#中位数np.median(x,axis) 与 np.percentile(x,50,axis)等价
#均值:np.mean(x,axis)的逻辑完全一样,不重复写了
np.random.seed(20200623)
x = np.random.randint(0, 20, size=[4, 5])
print(x)
# [[10  2  1  1 16]
#  [18 11 10 14 10]
#  [11  1  9 18  8]
#  [16  2  0 15 16]]
print(np.median(x))#10.0
print(np.median(x,axis=0)) #[13.5  2.   5.  14.5 13. ]
print(np.median(x,axis=1))#[ 2. 11.  9. 15.]
#——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#加权平均值:np.average(x,axis,weights),当weights默认时,与np.mean()等价,下面看weights的设置
x = np.random.randint(0,50,size=(3, 5))
w = np.arange(1, 16).reshape([3,5])
print(x)
# [[10 25 17 12 12]
#  [ 0 47 13 37 30]
#  [37 24 28 44 13]]
print(np.average(x))#23.266666666666666
print(np.average(x,weights=w))#26.291666666666668
print(np.average(x,axis=0,weights=w))#[23.2 31.8 21.6 36.9 18.5]
print(np.average(x,axis=1,weights=w))#[14.6 26.6 28.8]
#————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#方差:np.var(a,axis,ddof=0),当ddof=0时,分母为n,当ddof=1时,分母为n-1(即方差的无偏估计)
#标准差:np.std(a,axis,ddof=0)就是方差的算术平方根,用法是完全类似的,不重复写了
x = np.random.randint(0,25,size=(4,6))
print(x)
# [[ 0 14  6 14 10 13]
#  [ 3 22  3  8 11 12]
#  [ 2 20 23 21  4 17]
#  [ 7 10 11  3 11  0]]
print(np.var(x))
#46.08159722222222
print(np.mean((x - np.mean(x)) **2))
#46.08159722222222 (与上面一样)

print(np.var(x,ddof=1))
#48.08514492753623
print(np.sum((x - np.mean(x)) **2) / (x.size -1))
#48.08514492753623

print(np.var(x,axis=0))
# [ 6.5 22.8 58.2 45.2  8.5 40.2]
print(np.var(x,axis=1))
# [25.9 41.8 69.6 17.7]
#————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
x = [1, 2, 3, 4, 5]
print(np.var(x)) #2.0  方差:分母是n!
print(np.cov(x)) #2.5  样本方差:分母是n-1! np.cov(x)等同于np.vax(x,ddof=1)
#在numpy中,将x的每一行视作一个独立的变量,因此这里一共有4个3维的变量,因此将会输出一个4*4的协方差矩阵 ,其中对角线元素是每个维度的方差,非对角线上的元素则是不同维度间的协方差。
x=np.array([[1 ,5 ,6],
            [4 ,3 ,9],
            [4 ,2 ,9],
            [4 ,7 ,2]])
print(np.cov(x))
# [[ 7.   4.5  4.  -0.5]
#  [ 4.5 10.3 11.5 -7.2]
#  [ 4.  11.5 13.  -8.5]
#  [-0.5 -7.2 -8.5  6.3]]

#把前2行单独拿出来单独看
x = [1,5,6]
y = [4,3,9]
print(np.cov(x,y))
# [[ 7.   4.5]
#  [ 4.5 10.3]]

#注意:直接输入np.cov(x,y)会得到一个样本协方差矩阵(分母为n-1,不是n!),并不是我们想象的一个值:Cov(x,y)=E((x-E(x))*(y-E(y))=E(xy)-E(x)E(y),若要得到该值,需要用以下复杂的写法:
z = np.mean((x - np.mean(x)) * (y - np.mean(y)))
print(z) #3.0
#numpy设计者这么设计,可见在实际应用中,样本协方差比协方差更实用,样本协方差矩阵比一个样本协方差值更 实用
#——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#相关系数矩阵:np.corrcoef(x,y)
x, y = np.random.randint(0,30, size=(2,5))  #因为左边是2个变量,所以size的第一个参数必须为2!
print(x)#[ 9 12  9 16  7]
print(y)#[29 26 20 21 14]
print(np.corrcoef(x,y))
# [[1.  0.3]
#  [0.3 1. ]]

#注意:np.corrcoef(x,y)只能算2个数组的相关系数,作用很有限!计算np.corrcoef(x,y,z)将报错!
#————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————#
#numpy.digitize(x, bins, right=False)
#函数功能:返回一个和x形状相同的数据,返回值中的元素为对应x位置的元素落在bins中区间的索引号。
x = np.array([0.2, 6.4, 3.0, 1.6])
bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
inds = np.digitize(x, bins)
print(inds)
# [1 4 3 2]

课后作业:计算给定数组中每行的最大值。

x = np.random.randint(0, 20, size=(3,5))
print(x)
# [16 18 18  9  6]
#  [ 7 15  6 18 18]
#  [10  6 11  9  8]]
print(np.amax(x,axis=1))
# [18 18 11]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值