计算沿轴的修剪平均值

时间:2012-05-11 16:37:55

标签: python numpy scipy

我想计算沿轴的修剪平均值,而不需要显式循环。所以 应该做同样的事情:

arr=np.random.randn(3,10000)
arr[:,:5]+=999
arr=np.arange(3)[:,None]+arr
out=np.zeros(arr.shape[0])

for i in range(arr.shape[0]):
   col=arr[i,:]
   m=np.abs(col-col.mean())<2*col.std()    
   out[i]=col[m].mean()

print out
print arr.mean(1)

结果:

[-0.01085947  0.99187648  1.98009922]
[ 0.48822938  1.49126719  2.47951973]

2 个答案:

答案 0 :(得分:1)

>>> import numpy as np
>>> import numpy.ma as ma
>>> a = np.arange(24).reshape((6,4))
>>> mask=~(np.abs(a - a.mean(axis=1)[:,np.newaxis]) < a.std(axis=1)[:,np.newaxis])
>>> mask
array([[ True, False, False,  True],
       [ True, False, False,  True],
       [ True, False, False,  True],
       [ True, False, False,  True],
       [ True, False, False,  True],
       [ True, False, False,  True]], dtype=bool)
>>> ma.array(a,mask=mask).mean(axis=1).data
array([  1.5,   5.5,   9.5,  13.5,  17.5,  21.5])

答案 1 :(得分:1)

使用蒙面数组是这里的方法:

import numpy.ma as ma
arr = np.transpose(arr)
mask = np.abs(arr - arr.mean(0)) >= 2 * arr.std(0)
print ma.array(arr,mask=mask).mean(0)

提供与代码相同的输出。