【问题标题】:Mean of non-diagonal elements of each row numpy每行numpy的非对角线元素的平均值
【发布时间】:2020-09-26 18:04:43
【问题描述】:

我基本上有一个大小为n x n 的混淆矩阵,我所有的对角线元素都是1

对于每一行,我希望计算其平均值,不包括1,即不包括对角线值。 numpy有简单的方法吗?

这是我目前的解决方案:

mask = np.zeros(cs.shape, dtype=bool)
np.fill_diagonal(mask, 1)
print(np.ma.masked_array(cs, mask).mean(axis=1))

cs 是我的n x n 矩阵

代码看起来很复杂,我当然觉得有一个更优雅的解决方案。

【问题讨论】:

    标签: python numpy mean numpy-ndarray confusion-matrix


    【解决方案1】:

    一个简洁的使用summation -

    (cs.sum(1)-1)/(cs.shape[1]-1)
    

    对于忽略对角元素的一般情况,使用 np.diag 代替 1 偏移 -

    (cs.sum(1)-np.diag(cs))/(cs.shape[1]-1)
    

    另一个mean -

    n = cs.shape[1]
    (cs.mean(1)-1./n)*(n/(n-1))
    

    【讨论】:

    • 完美运行!
    • 由于混淆矩阵是方阵,除法时不需要特别取轴 1 的维数。但这是一个很好的做法。
    【解决方案2】:

    另一个简单的想法是使用内置的numpy.average() API,我们为混淆矩阵中的每个元素提供weights 以贡献平均值。这使我们可以灵活地通过将权重设置为零来排除矩阵中的任何元素。下面是一个完整的例子:

    # input array to work with
    In [51]: arr 
    Out[51]: 
    array([[ 1,  2,  3,  4],
           [ 5,  1,  7,  8],
           [ 9, 10,  1, 12],
           [13, 14, 15,  1]])
    
    # weightage for each of the elements in the input matrix
    In [52]: weights = (arr != 1).astype(int)  # boolean mask would also work
    
    # so, we give 0 weight to all the diagonal elements
    In [53]: weights 
    Out[53]: 
    array([[0, 1, 1, 1],
           [1, 0, 1, 1],
           [1, 1, 0, 1],
           [1, 1, 1, 0]])
    
    # finally, use the weights when computing average over axis 1
    In [54]: np.average(arr, axis=1, weights=weights) 
    Out[54]: array([ 3.        ,  6.66666667, 10.33333333, 14.        ])
    

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2018-04-21
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多