这个python规范化代码是如何工作的


cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

在学习图像识别的规范化过程中,我看到许多人使用此代码。我知道这句话是用来规范混淆矩阵的,这样它只包含0到1之间的数字。从而从矩阵中读取正确分类的样本的百分比。我数学不太好,但我想知道这句话到底是怎么写的。如果有人能帮我,我将不胜感激!

它沿着一个轴(轴1(找到一个和,然后沿着该轴用相应的和值进行广播除法。

所以假设你有:

>>> arr = np.arange(4*5).reshape(4, 5)
>>> arr
array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])

因此,首先,它沿着轴求和:

>>> arr.sum(1)
array([10, 35, 60, 85])

注意,您不能以当前形状广播这两个数组:

>>> arr / arr.sum(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (4,5) (4,)

拖尾轴必须是1,所以您添加了一个新轴,得到的形状(4,1(:

>>> arr.sum(1)[:, np.newaxis]
array([[10],
[35],
[60],
[85]])
>>> arr.sum(1)[:, np.newaxis].shape
(4, 1)

所以现在,广播部门工作:

>>> arr
array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>> arr.sum(1)[:, np.newaxis]
array([[10],
[35],
[60],
[85]])
>>> arr / arr.sum(1)[:, np.newaxis]
array([[0.        , 0.1       , 0.2       , 0.3       , 0.4       ],
[0.14285714, 0.17142857, 0.2       , 0.22857143, 0.25714286],
[0.16666667, 0.18333333, 0.2       , 0.21666667, 0.23333333],
[0.17647059, 0.18823529, 0.2       , 0.21176471, 0.22352941]])

阅读更多关于广播在numpy文档

最新更新