6
我有一个大小为N * M的矩阵,我想要找到每行的平均值。值是从1到5,没有任何值的条目设置为0.但是,当我想使用以下方法查找均值时,它给了我一个错误的均值,因为它也计算了值为0.非零值的Numpy均值
matrix_row_mean= matrix.mean(axis=1)
我怎样才能得到非零值的意思?
我有一个大小为N * M的矩阵,我想要找到每行的平均值。值是从1到5,没有任何值的条目设置为0.但是,当我想使用以下方法查找均值时,它给了我一个错误的均值,因为它也计算了值为0.非零值的Numpy均值
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
和影响那些原来zeros
,像这样 -
np.nanmean(np.where(matrix!=0,matrix,np.nan),1)
从性能的角度来看,我建议第一种方法。
np没有属性true_divide – HimanAB
@HimanUCC请检查编辑。 – Divakar
蒙面数组方法是紧凑的(但不一定更快):'np.ma.masked_equal(matrix,0).mean(axis = 1)' – hpaulj