numpy 相关统计  目录 1.numpy.amin() 计算最小值 2.计算极差(也就是最大值和最小值的差) 3.计算分位数 4.计算中位数 5.计算均值,沿轴的元素的总和除以元素的数量(counts) 6.计算加权平均值 7.计算方差 8.计算标准差 9.计算协方差矩阵 10.计算相关系数 11.直方图

numpy 相关统计
 目录
1.numpy.amin() 计算最小值
2.计算极差(也就是最大值和最小值的差)
3.计算分位数
4.计算中位数
5.计算均值,沿轴的元素的总和除以元素的数量(counts)
6.计算加权平均值
7.计算方差
8.计算标准差
9.计算协方差矩阵
10.计算相关系数
11.直方图

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])

meanaverage都是计算均值的函数,在不指定权重的时候averagemean是一样的。指定权重后,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-1n为样本个数),证明的链接

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 相关统计
 目录
1.numpy.amin() 计算最小值
2.计算极差(也就是最大值和最小值的差)
3.计算分位数
4.计算中位数
5.计算均值,沿轴的元素的总和除以元素的数量(counts)
6.计算加权平均值
7.计算方差
8.计算标准差
9.计算协方差矩阵
10.计算相关系数
11.直方图

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

numpy 相关统计
 目录
1.numpy.amin() 计算最小值
2.计算极差(也就是最大值和最小值的差)
3.计算分位数
4.计算中位数
5.计算均值,沿轴的元素的总和除以元素的数量(counts)
6.计算加权平均值
7.计算方差
8.计算标准差
9.计算协方差矩阵
10.计算相关系数
11.直方图

可以理解为,对角线的是各自的样本方差,反对角线是这两个样本方差相乘再开方

例子

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]