我注意到
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
但是,应该有一些区别,毕竟它们是两个不同的功能。
它们之间有什么区别?
我注意到
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
但是,应该有一些区别,毕竟它们是两个不同的功能。
它们之间有什么区别?
当前回答
除了前面提到的差异之外,我刚刚发现了另一个极其重要的差异:与np不同。意思是,np。Average不允许使用dtype关键字,而dtype关键字在某些情况下对于获得正确的结果至关重要。我有一个非常大的单精度数组,从h5文件访问。如果我沿着轴0和1取平均值,我会得到非常不正确的结果,除非我指定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。由于这个原因,再次使用平均值,但总是使用np.mean(.., dtype='float64')。如果我想要加权平均,我将显式地计算它使用权重向量和目标数组的乘积,然后是np。求和或np。适当时,要平均(也要适当精确)。
其他回答
除了前面提到的差异之外,我刚刚发现了另一个极其重要的差异:与np不同。意思是,np。Average不允许使用dtype关键字,而dtype关键字在某些情况下对于获得正确的结果至关重要。我有一个非常大的单精度数组,从h5文件访问。如果我沿着轴0和1取平均值,我会得到非常不正确的结果,除非我指定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。由于这个原因,再次使用平均值,但总是使用np.mean(.., dtype='float64')。如果我想要加权平均,我将显式地计算它使用权重向量和目标数组的乘积,然后是np。求和或np。适当时,要平均(也要适当精确)。
在调用中,这两个函数是相同的。
Average可以计算加权平均值。
文档链接:平均值和平均值
在某些版本的numpy中,还有另一个重要的区别,你必须知道:
平均值不考虑掩码,所以计算整个数据集的平均值。
均值包含掩码,所以只计算未掩码值的均值。
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。Average接受一个可选的权重参数。如果不提供,它们是等效的。看一下源代码:Mean, 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
...
np。Mean总是计算算术平均值,并为输入和输出提供了一些额外的选项(例如使用什么数据类型,将结果放在哪里)。
np。如果提供了weights参数,Average可以计算加权平均值。