numpy 相关统计
目录
1.numpy.amin() 计算最小值
numpy.amin(a[, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue, where=np._NoValue])
例子如下:
import numpy as np x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) #最小值 y = np.amin(x)#11 #每列最小值 y = np.amin(x, axis=0) print(y) # [11 12 13 14 15] #每行最小值 y = np.amin(x, axis=1) print(y) # [11 16 21 26 31]
其实直接使用x.min()也是同样的效果
print(x.min()) #11 print(x.min(axis=0)) #[11 12 13 14 15] print(x.min(axis=1)) #[11 16 21 26 31]
最大值也是同样的用法,就不赘述了
2.计算极差(也就是最大值和最小值的差)
numpy.ptp(a, axis=None, out=None, keepdims=np._NoValue)
例子如下:
import numpy as np 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.ptp(x)) # 18 #计算每列极差 print(np.ptp(x, axis=0)) # [ 8 10 10 17 8] #计算每行极差 print(np.ptp(x, axis=1)) # [15 8 17 16]
同理,使用x.ptp()也是OK的
3.计算分位数
numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=False)
- a:array,用来算分位数的对象,可以是多维的数组。
- q:介于0-100的float,用来计算是几分位的参数,如四分之一位就是25,如要算两个位置的数就[25,75]。
- axis:坐标轴的方向,一维的就不用考虑了,多维的就用这个调整计算的维度方向,取值范围0/1
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]] #如果只求某个分位数,直接使用int,如果是多个,则使用list print(np.percentile(x, 25)) #2.0 print(np.percentile(x, [25, 50])) # [ 2. 10.] print(np.percentile(x, [25, 50], axis=0)) # [[10.75 1.75 0.75 10.75 9.5 ] # [13.5 2. 5. 14.5 13. ]] print(np.percentile(x, [25, 50], axis=1)) # [[ 1. 10. 8. 2.] # [ 2. 11. 9. 15.]]
4.计算中位数
numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)
例子,和分位数是50的值是一样的
import numpy as np 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.percentile(x, 50)) print(np.median(x)) # 10.0 print(np.percentile(x, 50, axis=0)) print(np.median(x, axis=0)) # [13.5 2. 5. 14.5 13. ] print(np.percentile(x, 50, axis=1)) print(np.median(x, axis=1)) # [ 2. 11. 9. 15.]
注意:中位数和分位数都不可以使用x.median() 或者是x.percentile()
5.计算均值,沿轴的元素的总和除以元素的数量(counts)
numpy.mean(a[, axis=None, dtype=None, out=None, keepdims=np._NoValue)])
例子
import numpy as np x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.mean(x) print(y) # 23.0 y = np.mean(x, axis=0) print(y) # [21. 22. 23. 24. 25.] y = np.mean(x, axis=1) print(y) # [13. 18. 23. 28. 33.] #是否可以使用x.mean() print(x.mean()) #23.0
我们验证一下分母是否会考虑空值,答案是不可以的
a=np.array([1,2,3,4,5,np.nan]) print(a) #[ 1. 2. 3. 4. 5. nan] print(a.mean()) #nan print(np.mean(a)) #nan print(a[:-1].mean()) #3.0
6.计算加权平均值
numpy.average(a[, axis=None, weights=None, returned=False])
mean
和average
都是计算均值的函数,在不指定权重的时候average
和mean
是一样的。指定权重后,average
可以计算加权平均值。
计算加权平均值(将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。)
import numpy as np x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.average(x) print(y) # 23.0 y = np.average(x, axis=0) print(y) # [21. 22. 23. 24. 25.] y = np.average(x, axis=1) print(y) # [13. 18. 23. 28. 33.] y = np.arange(1, 26).reshape([5, 5]) print(y) # [[ 1 2 3 4 5] # [ 6 7 8 9 10] # [11 12 13 14 15] # [16 17 18 19 20] # [21 22 23 24 25]] z = np.average(x, weights=y) print(z) # 27.0 z = np.average(x, axis=0, weights=y) print(z) # [25.54545455 26.16666667 26.84615385 27.57142857 28.33333333] z = np.average(x, axis=1, weights=y) print(z) # [13.66666667 18.25 23.15384615 28.11111111 33.08695652]
第一行的均值怎么的来的:
sum(x[0]*y[0]/y[0].sum()) #13.666666666666668
也就是说分母其实就是y的求和,而mean的分母是个数
7.计算方差
numpy.var(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue])
ddof=0:是“Delta Degrees of Freedom”,表示自由度的个数
要注意方差和样本方差的无偏估计,方差公式中分母上是n
;样本方差无偏估计公式中分母上是n-1
(n
为样本个数),证明的链接
import numpy as np x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.var(x) print(y) # 52.0 y = np.mean((x - np.mean(x)) ** 2) print(y) # 52.0 y = np.var(x, ddof=1) print(y) # 54.166666666666664 y = np.sum((x - np.mean(x)) ** 2) / (x.size - 1) print(y) # 54.166666666666664 y = np.var(x, axis=0) print(y) # [50. 50. 50. 50. 50.] y = np.var(x, axis=1) print(y) # [2. 2. 2. 2. 2.] print(x.var())
8.计算标准差
numpy.std(a[, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue])
标准差是一组数据平均值分散程度的一种度量,是方差的算术平方根
import numpy as np x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.std(x) print(y) # 7.211102550927978 y = np.sqrt(np.var(x)) print(y) # 7.211102550927978 y = np.std(x, axis=0) print(y) # [7.07106781 7.07106781 7.07106781 7.07106781 7.07106781] y = np.std(x, axis=1) print(y) # [1.41421356 1.41421356 1.41421356 1.41421356 1.41421356]
9.计算协方差矩阵
numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None,aweights=None)
注意:
cov(x,0) = cov(x) =var(x) 都是计算 一维序列 x 的方差 (样本方差)
cov(X,Y) 计算两个一维序列 X,Y的协方差(也可以是 矩阵)。必须是各维数都相同
cov(X,1) 除以N而不是N-1 (方差)
cov(X,Y,1) 除以N而不是N-1
可以理解为,对角线的是各自的样本方差,反对角线是这两个样本方差相乘再开方
例子
import numpy as np x = [1, 2, 3, 4, 6] y = [0, 2, 5, 6, 7] print(np.cov(x)) # 3.7 #样本方差 print(np.cov(y)) # 8.5 #样本方差 print(np.cov(x, y)) # [[3.7 5.25] # [5.25 8.5 ]] print(np.var(x)) # 2.96 #方差 print(np.var(x, ddof=1)) # 3.7 #样本方差 print(np.var(y)) # 6.8 #方差 print(np.var(y, ddof=1)) # 8.5 #样本方差 z = np.mean((x - np.mean(x)) * (y - np.mean(y))) #协方差 print(z) # 4.2 z = np.sum((x - np.mean(x)) * (y - np.mean(y))) / (len(x) - 1) #样本协方差 print(z) # 5.25 z = np.dot(x - np.mean(x), y - np.mean(y)) / (len(x) - 1) #样本协方差 print(z) # 5.25
10.计算相关系数
numpy.corrcoef(x, y=None, rowvar=True, bias=np._NoValue, ddof=np._NoValue)
理解了np.cov()
函数之后,很容易理解np.correlate()
,二者参数几乎一模一样。
np.cov()
描述的是两个向量协同变化的程度,它的取值可能非常大,也可能非常小,这就导致没法直观地衡量二者协同变化的程度。相关系数实际上是正则化的协方差,n
个变量的相关系数形成一个n
维方阵
import numpy as np np.random.seed(20200623) x, y = np.random.randint(0, 20, size=(2, 4)) print(x) # [10 2 1 1] print(y) # [16 18 11 10] z = np.corrcoef(x, y) print(z) # [[1. 0.48510096] # [0.48510096 1. ]] a = np.dot(x - np.mean(x), y - np.mean(y)) b = np.sqrt(np.dot(x - np.mean(x), x - np.mean(x))) c = np.sqrt(np.dot(y - np.mean(y), y - np.mean(y))) print(a / (b * c)) # 0.4851009629263671
11.直方图
numpy.digitize(x, bins, right=False)
- x:numpy数组
- bins:一维单调数组,必须是升序或者降序
- right:间隔是否包含最右
- 返回值:x在bins中的位置
import numpy as np 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] for n in range(x.size): print(bins[inds[n] - 1], "<=", x[n], "<", bins[inds[n]]) # 0.0 <= 0.2 < 1.0 # 4.0 <= 6.4 < 10.0 # 2.5 <= 3.0 < 4.0 # 1.0 <= 1.6 < 2.5 import numpy as np x = np.array([1.2, 10.0, 12.4, 15.5, 20.]) bins = np.array([0, 5, 10, 15, 20]) inds = np.digitize(x, bins, right=True) print(inds) # [1 2 3 4 4] inds = np.digitize(x, bins, right=False) print(inds) # [1 3 3 4 5]