我注意到
In [30]: np.mean([1, 2, 3]) Out[30]: 2.0 In [31]: np.average([1, 2, 3]) Out[31]: 2.0
但是,应该有一些区别,毕竟它们是两个不同的功能。
它们之间有什么区别?
在调用中,这两个函数是相同的。
average可以计算一个加权平均值。
average
文档链接:mean和average
mean
np.mean总是计算算术平均值,并为输入和输出提供了一些额外的选项(例如使用什么数据类型,将结果放在哪里)。
np.mean
如果提供了weights参数,np.average可以计算加权平均值。
weights
np.average
np。Average接受一个可选的权重参数。如果不提供,它们是等效的。看一下源代码:的意思是, 平均
np.mean:
try: mean = a.mean except AttributeError: return _wrapit(a, 'mean', axis, dtype, out) return mean(axis, dtype, out)
np.average:
... if weights is None : avg = a.mean(axis) scl = avg.dtype.type(a.size/avg.size) else: #code that does weighted mean here if returned: #returned is another optional argument scl = np.multiply(avg, 0) + scl return avg, scl else: return avg ...
在numpy的某个版本中还有一个重要的区别,你必须知道:
average不考虑掩码,所以计算整个数据集的平均值。
mean接受帐户掩码,因此只计算未掩码值的平均值。
g = [1,2,3,55,66,77] f = np.ma.masked_greater(g,5) np.average(f) Out: 34.0 np.mean(f) Out: 2.0
除了前面提到的不同之处,还有一个非常重要的不同之处是我刚刚才发现的:与np.mean不同,np.average不允许使用dtype关键字,而在某些情况下,这对于获得正确的结果至关重要。我有一个非常大的单精度数组,可以从h5文件访问。如果我沿着轴0和1取平均值,我会得到非常不正确的结果,除非我指定dtype='float64':
dtype
h5
dtype='float64'
>T.shape (4096, 4096, 720) >T.dtype dtype('<f4') m1 = np.average(T, axis=(0,1)) # garbage m2 = np.mean(T, axis=(0,1)) # the same garbage m3 = np.mean(T, axis=(0,1), dtype='float64') # correct results
不幸的是,除非你知道要寻找什么,否则你不一定知道你的结果是错误的。由于这个原因,我将永远不会再使用np.average,但将始终在任何大型数组上使用np.mean(.., dtype='float64')。如果我想要一个加权平均值,我将显式地使用权重向量和目标数组的乘积来计算它,然后是np.sum或np.mean,视情况而定(也具有适当的精度)。
np.mean(.., dtype='float64')
np.sum