2016-07-23 1019 views
6

我有一个大小为N * M的矩阵,我想要找到每行的平均值。值是从1到5,没有任何值的条目设置为0.但是,当我想使用以下方法查找均值时,它给了我一个错误的均值,因为它也计算了值为0.非零值的Numpy均值

matrix_row_mean= matrix.mean(axis=1) 

我怎样才能得到非零值的意思?

回答

10

获取每行非零值的计数并将其用于平均每行的总和。因此,实施将是这个样子 -

np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 

如果你是在一个旧版本NumPy的,你可以使用计数的浮充转换,以取代np.true_divide,像这样 -

matrix.sum(1)/(matrix!=0).sum(1).astype(float) 

样品运行 -

In [160]: matrix 
Out[160]: 
array([[0, 0, 1, 0, 2], 
     [1, 0, 0, 2, 0], 
     [0, 1, 1, 0, 0], 
     [0, 2, 2, 2, 2]]) 

In [161]: np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 
Out[161]: array([ 1.5, 1.5, 1. , 2. ]) 

另一种方式来解决这个问题将是取代与NaNs零,然后用np.nanmean,这将忽略这些NaNs和影响那些原来zeros,像这样 -

np.nanmean(np.where(matrix!=0,matrix,np.nan),1) 

从性能的角度来看,我建议第一种方法。

+0

np没有属性true_divide – HimanAB

+0

@HimanUCC请检查编辑。 – Divakar

+0

蒙面数组方法是紧凑的(但不一定更快):'np.ma.masked_equal(matrix,0).mean(axis = 1)' – hpaulj