三:numpy的数字统计函数:
1.numpy有哪些数学统计函数:
(1)np.sum -------所有元素的和
(2)np.prod -------所有元素的乘积
(3)np.cumsum -------元素的累积加和
(4)np.cumprod-------元素的累积乘积
(5)np.min -------最小值
(6)np.max -------最大值
(7)np.percentile -----0——100百分数
(8)np.quantile -----0——1分位数
(9)np.median ------中位数
(10)np.average ------加权平均,参数可以指定weights
(11)np.mean ------平均值
(12)np.std ------标准差
(13)np.var -----方差
2.怎么实现按不同的axis计算(以上函数,都有一个参数叫做axis用于指定计算轴为行还是列,如果不指定,那么会计算所有元素的结果)
3.实例:机器学习将数据进行标准化
A=(A-mean(A,axis=0))/std(A,axis=0)
1b:
import numpy as np
arr=np.arange(12).reshape(3,4) #array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
np.sum(arr) #66
np.prod(arr) #0
np.comsum(arr) #array([0,1,3,6,10,15,21,28,36,45,55,66],dtype=int32)
np.cumprod(arr) #array([0,0,0,0,0,0,0,0,0,0,0,0],dtype=int32)
np.min(arr) #0
np.max(arr) #11
np.percentile(arr,[25,50,75]) #我的理解他会将arr排序,找到25%,50%,75%的数字
#2.75,5.5,8.25
np.quantile(arr,[0.25,0.5,0.75]) #2.75,5.5,8.25
np.mean(arr) #5.5
np.std(arr) #标准差 3.4520
np.var(arr) #方差 11.916666
#weights的shape需要和arr一样
weights=np.random.rand(*arr.shape) #确保weights类型和arr类型一致
np.average(arr,weights=weights) #加权平均
2b:
axis=0代表行,axis=1代表列
但是对于sum/mean/media等聚合函数:axis=0代表把行消解掉,axis=1代表把列消解掉。axis=0代表跨行计算,axis=1代表跨列计算
arr #array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
arr.sum(axis=0) #array([12,15,18,21])
arr.sum(axis=1) #array([6,22,38])
arr.cumsum(axis=0) #array([[0,1,2,3],[4,6,8,10],[12,15,18,21]])
arr.cumsum(axis=1) #array([[0,1,3,6],[4,9,15,22],[8,17,21,38]])
3b:
arr=np.arange(12).reshape(3,4)
#arr如果对应到现实世界的一种解释,行:每行对应一个样本数据。列:每列代表样本的一个特征(就是三个样本,四个特征)
#数据标准化:对于机器学习,神经网路来说,不同列的量纲应该相同,训练收敛的更快;比如商品价格是0到100元,销量是1万到10万个,这俩数字没有可比性(一个只有100.另外一个9万),因此需要先都做标准化;
#不同列代表不同的特征,因此需要axis=0做计算,标准化一般使用A=(A-mean(A,axis=0))/std(A,axis=0)公式进行
#计算每列的均值
mean=np.mean(arr,axis=0) #[4,5,6,7]
#计算每列的标准差
std=np.std(arr,axis=0)
#计算分子,注意每行都会分别减去[4,5,6,7]这叫做numpy的广播
fenzi=arr-mean
result=fenzi/std
用随机数在试一下:
arr2=np.random.randint(1,100,size=(3,4))
result=(arr2-np.mean(arr2,axis=0))/np.std(arr2,axis=0)
四:numpy实现数组中满足条件个数的计算:
需求:有一个非常大的数组比如一亿个数字,求出里面数字小于5000的数字数目
(1)使用numpy的rendom模块生成1亿个数字
import numpy as np
arr=np.random.randint(1,10000,size=int(1e8))
(2)使用python的原生语法实现
pyarr=list(arr)
len([x for x in pyarr if x>5000])
%timeit len([x for x in pyarr if x>5000]) #记一下时间
(3)使用numpy的向量化操作实现:
arr[arr>5000].size
%timeit arr[arr>5000].size