NumPy——统计函数

引入模块import numpy as np

1.numpy.sum(a, axis=None)/a.sum(axis=None)

根据给定轴axis计算数组a相关元素之和,axis整数或元组,不指定轴则默认求全部元素之和。

ashape(d0,d1,..,dn),当axis=(m1,m2,...mi)时,返回结果应是一个shape(d0,d1,...,dn)-(dm1,dm2,...dmi),每个元素是轴m1,m2,...mi上元素之和

例:

a = np.arange(24).reshape((2, 3, 4))  print("数组a:n", a)  print("np.sum(a):", np.sum(a))                   # 全部元素和  print("np.sum(a, axis=0):n", np.sum(a, axis=0))   # 第0轴(最外围)的元素和  print("np.sum(a, axis=1):n", np.sum(a, axis=1))    # 第1轴元素和  print("np.sum(a, axis=(0, 1)):n", np.sum(a, axis=(0, 1)))  # 第0轴和第1轴元素之和  print("np.sum(a, axis=(0, 2)):n", np.sum(a, axis=(0, 2)))  # 第0轴和第2轴元素之和

输出:

数组a:   [[[ 0  1  2  3]    [ 4  5  6  7]    [ 8  9 10 11]]     [[12 13 14 15]    [16 17 18 19]    [20 21 22 23]]]    np.sum(a): 276    np.sum(a, axis=0):   [[12 14 16 18]         # 0+12=12 1+13=14 ...   [20 22 24 26]          # 4+16=20 5+17=22   [28 30 32 34]]    np.sum(a, axis=1):   [[12 15 18 21]         # 0+4+8=12 1+5+9=15 ...   [48 51 54 57]]         # 12+16+20=48 13+17+21=51     np.sum(a, axis=(0, 1)):   [60 66 72 78]          # 0+4+8+12+16+20=60 1+5+9+13+17+21=66...    np.sum(a, axis=(0, 2)):   [ 60  92 124]          # 0+1+2+3+12+13+14+15=60 4+5+6+7+16+17+18+19=92....

2.numpy.mean(a, axis=None)/a.mean(axis=None)`

根据给定轴axis计算数组a相关元素的平均值axis整数或元组。

不指定axis,默认求所有元素平均值。指定axis,求指定轴上元素平均值。

ashape(d0,d1,..,dn),当axis=(m1,m2,...mi)时,返回结果应是一个shape(d0,d1,...,dn)-(dm1,dm2,...dmi),每个元素是轴m1,m2,...mi上所有元素的平均值

例:

print("数组a:n", a)  print("np.mean(a):", np.mean(a))    # 全部元素的平均值  print("np.mean(a, axis=0):n", np.mean(a, axis=0))  # 0轴上的平均值  print("np.mean(a, axis=(0, 2)):n", np.mean(a, axis=(0, 2)))    # 0轴和2轴平均值

输出:

数组a:   [[[ 0  1  2  3]    [ 4  5  6  7]    [ 8  9 10 11]]     [[12 13 14 15]    [16 17 18 19]    [20 21 22 23]]]  np.mean(a): 11.5  np.mean(a, axis=0):   [[ 6.  7.  8.  9.]         # (0+12)/2=6 (1+13)/2=7...   [10. 11. 12. 13.]          # (4+16)/2=10 (5+17)/2=11...   [14. 15. 16. 17.]]         # (8+20)/2=14 (9+21)/2=15..  np.mean(a, axis=(0, 2)):   [ 7.5 11.5 15.5]           # (0+1+2+3+12+13+14+15)/2=7.5..  

3.numpy.average(a,axis=None,weights=None)

根据给定轴axis计算数组a相关元素的加权平均值,

weights是一个权重数组,形状应与给定数组ashape相同,即:weights.shape=a.shape或者在指定一个轴axis时,weight则应是一个一维数组,数组元素个数与指定轴维度数相同。

当不指定weigts时,此时即为求平均值,效果同.mean相同

例:

print("数组a:n", a)  print("np.average(a, axis=0):n", np.average(a, axis=0))  print("np.average(a, axis=0, weights=[10, 1]):n", np.average(a, axis=0, weights=[10, 1]))  wei = np.random.randint(1, 60, (2, 3, 4 ))  print("权重数组是:", wei)  print("np.average(a, axis=(0, 2), weights=wei):n", np.average(a, axis=(0, 2), weights=wei))

输出:

数组a:   [[[ 0  1  2  3]    [ 4  5  6  7]    [ 8  9 10 11]]     [[12 13 14 15]    [16 17 18 19]    [20 21 22 23]]]  np.average(a, axis=0):   [[ 6.  7.  8.  9.]   [10. 11. 12. 13.]   [14. 15. 16. 17.]]  np.average(a, axis=0, weights=[10, 1]):   [[ 1.09090909  2.09090909  3.09090909  4.09090909] # (0*10+12*1)/(10+1)=1.0909   [ 5.09090909  6.09090909  7.09090909  8.09090909]  # (4*10+16*1)/(10+1)=5.0909   [ 9.09090909 10.09090909 11.09090909 12.09090909]]  权重数组是: [[[37  5 50  9]    [ 9 40 17 42]    [45  4 41 29]]     [[17 24 29 37]    [20  8 14 37]    [ 3  1 48 14]]]  np.average(a, axis=(0, 2), weights=wei):   [ 7.73557692 10.92513369 13.96756757]  # (0*37+1*5+2*50+3*9+12*17+13*24+14*29+15*37)/(37+5+50+9+17+24+29+37)=7.7355  

4.numpy.std(a,axis=None)/a.std(axis=None)       numpy.var(a,axis=None)/a.var(axis=None)

.std(a,axis=None)根据给定轴axis计算数组a相关元素的总体标准差(要与样本标准差区分)

即:(sigma=sqrt{{frac 1N}sum_{i=1}^N(x_i-overline x)^2})

(Standard Deviation)——std标准差,又称均方差

.var(a,axis=None)根据给定轴axis计算数组a相关元素的总体方差

即:(sigma^2={frac {sum_{i=1}^N(x_i-overline x)^2}N})

variance——var方差

b = np.random.randint(1, 30, (2, 3, 4))  print("数组b:n", b)  print("np.std(b, axis=2):n", np.std(b, axis=2))    # 标准差  print("np.var(b, axis=2):n", np.var(b, axis=2))    # 方差

输出:

数组b:   [[[16  8 27 24]    [12 15 25  8]    [11 19 15 26]]     [[29 15 18 24]    [17  8  4 15]    [ 2 28 10 21]]]  np.std(b, axis=2):   [[7.39509973 6.28490254 5.53962995]   [5.40832691 5.24404424 9.98436277]]  np.var(b, axis=2):   [[54.6875 39.5    30.6875]   [29.25   27.5    99.6875]]  

我们来检验一下,例如,对2轴中12 15 25 8这组数据进行求标准差:

均值为:(overline x=15)

则样本标准差为:(sigma=sqrt{frac {(12-15)^2+(15-15)^2+(25-15)^2+left(8-15right)^2}{4}}=sqrt{39.5}approx6.284902544988)

方差为:(sigma^2=39.5)

5.最值函数

numpy.amin(a,axis=None)/numpy.min(a,axis=None)/a.min(axis=None)

返回轴axis上的最小值,若不指定轴,默认返回所有元素最小值

numpy.amax(a,axis=None)/numpy.max(a,axis=None)/a.max(axis=None)

返回轴axis上的最大值,若不指定轴,默认返回所有元素最大值

例:

c = np.random.randint(1, 60, (2, 3, 4))  print("数组c:n", c)  print("np.min(c):     ", np.min(c))  print("np.amin(c, axis=1):n", np.amin(c, axis=1))  print("c.min(axis=2): n", c.min(axis=2))  print("-"*20 + '分割线' + '-'*20)  print("np.max(c):    ", np.max(c))  print("np.amax(c, axis=1):n", np.amax(c, axis=1))  print("c.max(axis=2):n", c.max(axis=2))

输出:

数组c:   [[[15 50 24  6]    [ 2  8 27 53]    [52 23  9 35]]     [[17 38 42 20]    [ 4 32  9 17]    [48 39 17 40]]]  np.min(c):      2  np.amin(c, axis=1):   [[ 2  8  9  6]   [ 4 32  9 17]]  c.min(axis=2):   [[ 6  2  9]   [17  4 17]]  --------------------分割线--------------------  np.max(c):     53  np.amax(c, axis=1):   [[52 50 27 53]   [48 39 42 40]]  c.max(axis=2):   [[50 53 52]   [42 32 48]]

严格的说,a.min等并不是NumPy库的函数


6.最值下标

numpy.argmin(a,axis=None)/a.argmin(axis=None)

返回数组指定轴上最小值降成一维后的相对坐标

numpy.argmax(a,axis=None)/a.argmax(axis=None)

返回数组指定轴上最大值降成一维后的相对坐标

例:

print("数组c:n", c)  print("c.argmax():  ", c.argmax())  print("np.argmax(c, axis=2):n", np.argmax(c, axis=2))  print("-"*20 + '分割线' + '-'*20)  print("np.argmin(c):  ", np.argmin(c))  print("c.argmin(axis=1):n", c.argmin(axis=1))

输出:

数组c:   [[[50 44 13 16]    [26 23 31 35]    [ 5 21 42  8]]     [[ 6 53 10 57]    [14  5 18 38]    [40 31  4 55]]]  c.argmax():   15        # 降一维后57下标是15  np.argmax(c, axis=2):   [[0 3 2]               # 在轴2上,50-0 35-3 42-2  57-3  38-3  55-3   [3 3 3]]  --------------------分割线--------------------  np.argmin(c):   22  c.argmin(axis=1):   [[2 2 0 2]   [0 1 2 1]]

7.numpy.unravel_index(index, shape)

根据shape将一维下标index转换成多维下标(对应shape的下标),与6中的argmax,argmin配合使用

例:

print("数组c:n", c)  print(np.unravel_index(np.argmax(c), c.shape))

输出:

 [[[22  4 28 56]    [45 34  3 22]    [59 43 43 27]]     [[32 35 47 53]    [ 7 27 41 18]    [40 32 30 43]]]  (0, 2, 0)           # 59是数组最大值,其索引坐标为(0,2,0)

8.numpy.median(a,axis=None)

返回数组在指定轴上的中位数(中值),若不指定轴,默认返回全部元素中位数

例:

print("数组c:n", c)  print("np.median(c):  ", np.median(c))

输出:

[[[17 59 14 23]    [27 59  6 12]    [43 16 27 17]]     [[12 10  5 17]    [21 55 18 42]    [41 36 40  5]]]  np.median(c):   19.5

9.其他函数

numpy.ptp(a,axis=None)/a.ptp(a,axis=None)

计算指定轴上最大值与最小值的差,若不指定axis,默认为全部元素

例:

print("np.ptp(c):  ", np.ptp(c))  print("c.ptp(axis=1):n", c.ptp(axis=1))

输出:

数组c:   [[[35 28 18 38]    [44 56  7 24]    [ 4 59  2 24]]     [[55 56  5 27]    [18 44 22  1]    [ 3 30 20 43]]]  np.ptp(c):   58     #   59-1=58  c.ptp(axis=1):   [[40 31 16 14]     # 44-4=40 59-28=31 ...   [52 26 17 42]]

numpy.percentile(a, q, axis=None)

  1. a:输入数组
  2. q:要计算的百分位数,在0~100之间
  3. axis:计算百分位数的轴

返回一个数,满足至少有q%的数小于或等于该值,且至少有(100-q)%的数大于或等于该值。

例:

d = np.random.randint(1, 40, (2, 5))  print("数组d:n", d)  print("np.percentile(d, 40):    ", np.percentile(d, 40))  print("np.percentile(d, 40, axis=1):n", np.percentile(d, 40, axis=1))

输出:

数组d:   [[39 15 35 17 39]   [20 12 36 19 10]]  np.percentile(d, 40):     18.200000000000003  np.percentile(d, 40, axis=1):   [27.8 16.2]              

很多函数参数列表中都有keepdims=Falsekeepdims是保持数组维度特性,如果keepdimsTrue,则返回仍会用多维数组[]包含

参考资料

奇客谷——NumPy统计函数

官方文档—统计函数

官方文档—排序、搜索和计数