numpy学习|average()函数基础
【1】引言
求平均数是常见的数学操作,使用python做数学计算,掌握基础的求平均值操作函数average()非常重要。
今天我们就一起学习一下。
【2】官网教程
首先我们打开官网,可通过下述链接直达:
https://numpy.org/doc/stable/reference/generated/numpy.average.html
官网都是英文,不过示例都非常简单,我经过自主理解后,用自己的理解再给大家解释一下。
【3】官网说明
官网给出的average()函数定义式为:
numpy.average(a, axis=None, weights=None, returned=False, *, keepdims=<no value>)
在这里:
a:是一个数组,至少两个数组成的数组才适合计算平均值;
axis:对于多维数组,可以在不同的方向上计算平均值;
weights:各个数字的权重
returned:是否返回均值和权重总值
keepdims:保持维度,一般不设置,但不适用于矩阵。
之后我们把官网的代码拿进来进行解读。
【4】代码解读
【4.1】算术平均值和加权平均值
首先引入计算模块,然后立即定义了要操作的数组:
import numpy as np #引入计算模块 data = np.arange(1, 5) #定义数组
之后比较谨慎,先对数组进行直接输出:
print('数组=',data) #打印数组
然后再求算术平均值:
print('数组的算术平均值=',np.average(data)) #对数组求算术平均值
最后计算加权平均值:
a=np.average(np.arange(1, 11), weights=np.arange(10, 0, -1)) #对数组求加权平均值
print('数组的加权平均值=',a)
注:上述代码和官网略有不同,因为只有增加了print()函数,也就是改成上述代码模样,才可以在pycharm编辑器中成功运行代码。
代码运行后的结果为:

图1
算数平均值计算公式为:
avg = sum(a ) / sum(number of a) 算术平均值=数据总和/数据个数
所以代码运行的时候:算术平均值=(1+2+3+4)/4=2.5
加权平均值计算公式为:
avg = sum(a * weights) / sum(weights) 加权平均值=数据*权重后的总和/所有权重
所以代码运行的时候:加权平均值会先计算各个数据的权重,然后权重和数据相乘后求和,最后再除以总权重。
为明确显示这个过程,使用下述代码把权重和对应数据打印出来:
print('数组进行加权计算的各个数据=',np.arange(1, 11))
print('数组各个数据对应的权重值=',np.arange(10, 0, -1))
运行代码后的输出为:
数组进行加权计算的各个数据= [ 1 2 3 4 5 6 7 8 9 10]
数组各个数据对应的权重值= [10 9 8 7 6 5 4 3 2 1]
然后我们可以自己验证一下:
首先在excel中输入上述两行数据,然后先按照加权的方式计算加权后的总和,然后在计算权重总和,最后计算加权总和和权重总和的商,效果可参考表1:
| 总和 | |||||||||||
| 数据 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 55 |
| 权重 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 55 |
| 数据*权重 | 10 | 18 | 24 | 28 | 30 | 30 | 28 | 24 | 18 | 10 | 220 |
| 加权平均值 | 4 | ||||||||||
| 算术平均值 | 5.5 | ||||||||||
表1
其实理解下来:算术平均值就是所有数据的权重都等于1后的结果。
至此看完整代码会很好理解:
import numpy as np #引入计算模块
data = np.arange(1, 5) #定义数组
print('数组=',data) #打印数组
print('数组的算术平均值=',np.average(data)) #对数组求算术平均值
a=np.average(np.arange(1, 11), weights=np.arange(10, 0, -1)) #对数组求加权平均值
print('数组的加权平均值=',a)
print('数组进行加权计算的各个数据=',np.arange(1, 11))
print('数组各个数据对应的权重值=',np.arange(10, 0, -1))
【4.2】在不同方向上计算算术平均值和加权平均值
在这里先定义了新的数组,为三行两列:
data1 = np.arange(6).reshape((3, 2))
print('数组=',data1)
之后先对axis=1方向上的数据进行加权平均值计算:
b=np.average(data1, axis=1, weights=[1./4, 3./4])
print('当axis=1时的数组加权平均值=',b)
然后在未定义axis的基础上,再求一次加权平均值:
c=np.average(data, weights=[1./4, 3./4])
print('当axis未定义时的数组加权平均值=',b)
运行代码后的输出为:
数组= [[0 1]
[2 3]
[4 5]]
当axis=1时的数组加权平均值= [0.75 2.75 4.75]
Traceback (most recent call last):...
TypeError: Axis must be specified when shapes of a and weights differ.
虽然当axis未定义时的数组加权平均值输出错误,但当axis=1时的数组加权平均值成功输出。
我们来追溯一下具体算法:
【1】当axis=1时,一共输出了三个数据,数组是三行两列,所以先推算计算是针对行进行的;
【2】对第一行数据[0,1]进行验证,因为权重分别是[1./4,3./4],所以加权平均值的计算为:
(0*1./4+1*3./4)/(1./4+*3./4)=0.75;
【3】对第二行数据[2,3]进行验证,因为权重分别是[1./4,3./4],所以加权平均值的计算为:
(2*1./4+3*3./4)/(1./4+*3./4)=2.75;
【4】对第三行数据[4,5]进行验证,因为权重分别是[1./4,3./4],所以加权平均值的计算为:
(4*1./4+5*3./4)/(1./4+*3./4)=4.75。
可见axis=1时的数组加权平均值的全部结果获得验证:每一行分别加权。
接下来尝试修改axis=1时的算法,因为运行结果提示Axis must be specified when shapes of a and weights differ.
也就是权重和数据应该在外形上一致,为此修改权重定义后的代码为:
c=np.average(data1, weights=[[1./4, 3./4],[1./4, 3./4],[1./4, 3./4]])
此时运行代码,发现没有报错,输出为:
当axis未定义时的数组加权平均值= 2.75
其实追溯下来非常简单:因为数组和权重都是三行两列,先按照行计算加权后的总和,然后再除以权重总和。
至此的完整代码为:
import numpy as np #引入计算模块
data = np.arange(1, 5) #定义数组
print('数组=',data) #打印数组
print('数组的算术平均值=',np.average(data)) #对数组求算术平均值
a=np.average(np.arange(1, 11), weights=np.arange(10, 0, -1)) #对数组求加权平均值
print('数组的加权平均值=',a)
print('数组进行加权计算的各个数据=',np.arange(1, 11))
print('数组各个数据对应的权重值=',np.arange(10, 0, -1))
data1 = np.arange(6).reshape((3, 2))
print('数组=',data1)
b=np.average(data1, axis=1, weights=[1./4, 3./4])
print('当axis=1时的数组加权平均值=',b)
#c=np.average(data1, weights=[1./4, 3./4,1./4, 3./4,1./4, 3./4])
c=np.average(data1, weights=[[1./4, 3./4],[1./4, 3./4],[1./4, 3./4]])
print('当axis未定义时的数组加权平均值=',c)
【5】总结
学习了average()函数计算算术和加权平均值的基本技巧。
更多推荐


所有评论(0)