Numpy意味着非零值

Him*_*nAB 12 python numpy

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

matrix_row_mean= matrix.mean(axis=1)
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到非零值的平均值?

Div*_*kar 16

获取每行中的非零数,并使用它来平均每行的总和.因此,实现看起来像这样 -

np.true_divide(matrix.sum(1),(matrix!=0).sum(1))
Run Code Online (Sandbox Code Playgroud)

如果您使用的是旧版本的NumPy,则可以使用计数的浮点转换来替换np.true_divide,如下所示 -

matrix.sum(1)/(matrix!=0).sum(1).astype(float)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

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. ])
Run Code Online (Sandbox Code Playgroud)

解决问题的另一种方法是用零替换零,NaNs然后使用np.nanmean,这将忽略那些NaNs,实际上是那些原始的zeros,如此 -

np.nanmean(np.where(matrix!=0,matrix,np.nan),1)
Run Code Online (Sandbox Code Playgroud)

从性能的角度来看,我会推荐第一种方法.

  • 屏蔽数组方法很紧凑(但不一定更快):`np.ma.masked_equal(matrix, 0).mean(axis=1)` (2认同)

Ram*_*nez 10

我将在这里详细介绍使用掩码数组的更通用的解决方案。为了说明细节,让我们创建一个只有一个的下三角矩阵:

matrix = np.tril(np.ones((5, 5)), 0)
Run Code Online (Sandbox Code Playgroud)

如果你上面的术语不清楚,这个矩阵看起来像这样:

  [[ 1.,  0.,  0.,  0.,  0.],
   [ 1.,  1.,  0.,  0.,  0.],
   [ 1.,  1.,  1.,  0.,  0.],
   [ 1.,  1.,  1.,  1.,  0.],
   [ 1.,  1.,  1.,  1.,  1.]]
Run Code Online (Sandbox Code Playgroud)

现在,我们希望我们的函数为每一行返回 1 的平均值。或者换句话说,轴 1 上的平均值等于五个 1 的向量。为了实现这一点,我们创建了一个掩码矩阵,其中值为零的条目被认为是无效的。这可以通过以下方式实现np.ma.masked_equal

masked = np.ma.masked_equal(matrix, 0)
Run Code Online (Sandbox Code Playgroud)

最后,我们在这个数组中执行 numpy 操作,这将系统地忽略被屏蔽的元素(0)。考虑到这一点,我们通过以下方式获得所需的结果:

masked.mean(axis=1)
Run Code Online (Sandbox Code Playgroud)

这应该产生一个向量,其条目只有一个。


更详细的输出np.ma.masked_equal(matrix, 0)应该是这样的:

masked_array(data =
 [[1.0 -- -- -- --]
 [1.0 1.0 -- -- --]
 [1.0 1.0 1.0 -- --]
 [1.0 1.0 1.0 1.0 --]
 [1.0 1.0 1.0 1.0 1.0]],
             mask =
 [[False  True  True  True  True]
 [False False  True  True  True]
 [False False False  True  True]
 [False False False False  True]
 [False False False False False]],
       fill_value = 0.0)
Run Code Online (Sandbox Code Playgroud)

这表明 eh 值--被认为是无效的。这也在掩码数组的掩码属性中显示为 True ,这表明它是一个无效元素,因此应该被忽略。

最后,对这个数组的均值运算的输出应该是:

masked_array(data = [1.0 1.0 1.0 1.0 1.0],
             mask = [False False False False False],
       fill_value = 1e+20)
Run Code Online (Sandbox Code Playgroud)