每行 numpy 的非对角线元素的平均值

Mean of non-diagonal elements of each row numpy

我基本上有一个大小为 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 矩阵

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

一个使用 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))

另一个直接的想法是使用内置的 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.        ])