5. 聚合

当面对大量数据的时候,我们经常需要可计算数据的一些统计方面的信息,所幸numpy给我们提供了很多好用的聚合类功能,可以让我们方便的进行一些操作。

numpy的聚合可以直接作用在数组上面,不需要每次都numpy.xxx调用。

很多功能Python也有提供,一般如果名称相同功能也相同,但numpy版本相对速度比python同名功能要快。

numpy中可用的聚合函数如下,需要注意的是,除any和all之外,每个函数都存在一个NaN安全的版本,形式是在函数名称前加nan,例如np.nansum就是sum的NaN安全版本。

所谓NaN安全版本就是运算的时候自动忽略NaN的值造成的干扰。

  • np.sum: 和
  • np.prod: 积
  • np.mean: 平均数
  • np.std: 标准差
  • np.var: 方差
  • np.min: 最小值
  • np.max: 最大值
  • np.argin: 最小值的索引
  • np.argmax: 最大值的索引
  • np.median: 中位数
  • mp.oercentile: 基于元素排序的统计值
  • np.any: 是否至少存在一个为真的元素
  • np.all: 所有元素是否为真

下面我们给大家举例介绍:

5.1. 适用通用函数的聚合函数

此类函数主要指的是reduce和accumulate。

  • reduce: 功能同python的标准reduce一致,即重复执行某一个操作直到最后一个结果。
  • accumulate: 重复执行某一操作,但计算的中间结果会被存储
# reduce
a = np.arange(100)

# 把a内所有值进行相加
b = np.add.reduce(a)
print("b = ", b)

# 把a内所有制相加,但相加的中间结果需要保存下来
c = np.add.accumulate(a)
print("c = \n", c)
b =  4950
c = 
 [   0    1    3    6   10   15   21   28   36   45   55   66   78   91
  105  120  136  153  171  190  210  231  253  276  300  325  351  378
  406  435  465  496  528  561  595  630  666  703  741  780  820  861
  903  946  990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540
 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415
 2485 2556 2628 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486
 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656 4753
 4851 4950]

5.2. 数组值求和

numpy.sum函数和python的求和函数功能基本一致,但是还是有一些小区别:

  • numpy的求和函数具有维度的概念,求和内容可以是数组
  • 同时参数含义跟python的sum并不一致
  • numpy.sum速度快一些
# 
a = np.arange(100).reshape((10,10))

b = np.sum(a)
print(b)
4950

5.3. 最大值和最小值

求最大值最小值:

  • min:最小值
  • max:最大值
# 请注意一下三个求最小值的区别

a = np.random.rand(20)
print("a = \n", a)

# 调用pyhton的标准min
m1 = min(a)
print("最小值: ", m1)

# 调用numpy的min
m2 = np.min(a)
print("最小值: ", m2)

# numpy.min的简写形式,跟进a的类型会自动调用numpy.min
m3 = a.min()
print("最小值: ", m3)
a = 
 [0.23934032 0.15596611 0.85993783 0.13911453 0.03351837 0.73838562
 0.21018289 0.72901198 0.94990497 0.980913   0.40451059 0.22112041
 0.29087158 0.86319102 0.30870189 0.53390399 0.74920732 0.00546603
 0.60973917 0.15531549]
最小值:  0.005466033221787847
最小值:  0.005466033221787847
最小值:  0.005466033221787847

5.4. 多维度聚合

numpy研究的数据经常是多个维度的,这时候经常需要的操作是沿着某一轴进行操作,此时,聚合函数都会有一个参数axis,用来表示需要沿着哪个轴进行聚合。

a = np.random.randint(100, size=(4,5))
print("a = \n", a)

# 求最大值,每一行
b = a.max(axis=1)
print("a每一行的最大值是: ", b)

# 求每一列的和
c = a.sum(axis=0)
print("a每一列的和是:", c)
a = 
 [[48 17  0 54 12]
 [76  1 69 14 36]
 [77 44 90 32 50]
 [44 45  8  9 68]]
a每一行的最大值是:  [54 76 90 68]
a每一列的和是: [245 107 167 109 166]