每行 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. ])
我基本上有一个大小为 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. ])