代码之家  ›  专栏  ›  技术社区  ›  Jan

求每行非零值的平均值,并避免RuntimeWarning和NaN,因为某些行都为零

  •  0
  • Jan  · 技术社区  · 8 年前

    我已经查过了 Numpy mean of nonzero values 而且效果很好。然而,我的矩阵的一些行都是零元素。避免的好方法是什么 RuntimeWarning: invalid value encountered in true_divide 在这种情况下?另外,我不希望零元素被替换为 Nan 在这里

    eachPSM = np.ones([3,4])
    eachPSM[0] = 0
    print eachPSM
    >> [[ 0.  0.  0.  0.]
     [ 1.  1.  1.  1.]
     [ 1.  1.  1.  1.]]
    print np.true_divide(eachPSM.sum(1),(eachPSM!=0).sum(1))
    >> RuntimeWarning: invalid value encountered in true_divide
    [ nan   1.   1.]
    
    4 回复  |  直到 8 年前
        1
  •  2
  •   Divakar    8 年前

    a masking -

    invalid_val = np.nan # specifies mean value to be assigned for all zeros rows
    out = np.full(a.shape[0],invalid_val)
    count = (a!=0).sum(1)
    valid_mask = count!=0
    out[valid_mask] = a[valid_mask].sum(1)/count[valid_mask]
    
        2
  •  0
  •   Eric Bridger    8 年前
    import warnings
    ...
    with warnings.catch_warnings():
      warnings.simplefilter("ignore", category=RuntimeWarning)
    

    eachPSM[np.isnan(eachPSM)] = 0

        3
  •  0
  •   Bharath M Shetty    8 年前

    x = eachPSM.sum(1)
    y = (eachPSM!=0).sum(1)
    y[y==0] =  1 
    np.true_divide(x,y)
    
    #array([ 0.,  1.,  1.])
    
        4
  •  0
  •   B. M.    8 年前

    屏蔽阵列提供了优雅的解决方案:

    eachPSM = np.ones([3,4])
    eachPSM[0] = 0
    eachPSM[1,1] = 0
    
    #[[ 0.  0.  0.  0.]
    # [ 1.  0.  1.  1.]
    # [ 1.  1.  1.  1.]]
    
    In [39]: np.ma.masked_equal(eachPSM,0).mean(1)
    Out[39]: 
    masked_array(data = [-- 1.0 1.0],
                 mask = [ True False False],
           fill_value = 1e+20)
    
    In [40]: np.ma.masked_equal(eachPSM,0).mean(1).data
    Out[40]: array([ 0.,  1.,  1.])