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

matrix_row_mean= matrix.mean(axis=1)

如何才能得到只有非零值的平均值?

最佳答案

得到每行中非零的计数,并用它来平均每行的求和。因此,实现看起来像这样-

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并且实际上是那些原始的-
np.nanmean(np.where(matrix!=0,matrix,np.nan),1)

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

关于python - Numpy意味着非零值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38542548/

10-13 07:21