Sib*_*ing 170 python statistics numpy average mean
我注意到了
In [30]: np.mean([1, 2, 3])
Out[30]: 2.0
In [31]: np.average([1, 2, 3])
Out[31]: 2.0
Run Code Online (Sandbox Code Playgroud)
但是,应该存在一些差异,因为毕竟它们是两个不同的功能.
它们之间有什么区别?
Ham*_*mer 167
np.average采用可选的权重参数.如果没有提供它们是等效的.看一下源代码:Mean,Average
np.mean:
try:
mean = a.mean
except AttributeError:
return _wrapit(a, 'mean', axis, dtype, out)
return mean(axis, dtype, out)
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
Amb*_*ber 24
np.mean
始终计算算术平均值,并为输入和输出提供一些附加选项(例如,要使用的数据类型,放置结果的位置).
np.average
如果weights
提供参数,则可以计算加权平均值.
G M*_*G M 19
在某些版本的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
Run Code Online (Sandbox Code Playgroud)
除了已经注意到的差异之外,还有另一个非常重要的差异,我刚刚发现了它的艰难方式:不同np.mean
,np.average
不允许使用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
Run Code Online (Sandbox Code Playgroud)
不幸的是,除非您知道要查找什么,否则您不一定能判断出您的结果是错误的。np.average
由于这个原因,我永远不会再使用,但将始终np.mean(.., dtype='float64')
在任何大型阵列上使用。如果我想的加权平均,我会计算它明确地使用权重向量的乘积和所述目标阵列,然后或者np.sum
或np.mean
酌情(具有适当的精度以及)。
归档时间: |
|
查看次数: |
124293 次 |
最近记录: |