Nim*_*and 17 python numpy python-2.7
我是Python的新手,我正在学习TensorFlow.在使用notMNIST数据集的教程中,他们给出了将标签矩阵转换为n个编码数组的示例代码.
目标是采用由标签整数0 ... 9组成的数组,并返回一个矩阵,其中每个整数已转换为一个n编码数组,如下所示:
0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
...
Run Code Online (Sandbox Code Playgroud)
他们提供的代码是:
# Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]
labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)
Run Code Online (Sandbox Code Playgroud)
但是,我不明白这段代码是如何做到的.看起来它只是生成0到9范围内的整数数组,然后将其与标签矩阵进行比较,并将结果转换为浮点数.==运算符如何产生一个n编码矩阵?
DSM*_*DSM 30
这里有一些事情:numpy的矢量操作,添加单例轴和广播.
首先,你应该能够看到它是如何==做到的.
假设我们从一个简单的标签数组开始. ==以矢量化方式运行,这意味着我们可以将整个数组与标量进行比较,并获得由每个元素比较的值组成的数组.例如:
>>> labels = np.array([1,2,0,0,2])
>>> labels == 0
array([False, False, True, True, False], dtype=bool)
>>> (labels == 0).astype(np.float32)
array([ 0., 0., 1., 1., 0.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
首先我们得到一个布尔数组,然后我们强制浮动:Python中的False == 0,True == 1.所以我们得到一个数组,其中0 labels表示不等于0和1.
但是与0比较没有什么特别之处,我们可以比较1或2或3而不是类似的结果:
>>> (labels == 2).astype(np.float32)
array([ 0., 1., 0., 0., 1.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
实际上,我们可以遍历每个可能的标签并生成这个数组.我们可以使用listcomp:
>>> np.array([(labels == i).astype(np.float32) for i in np.arange(3)])
array([[ 0., 0., 1., 1., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 1.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
但这并没有真正利用numpy.我们想要做的是将每个可能的标签与每个元素进行比较,IOW进行比较
>>> np.arange(3)
array([0, 1, 2])
Run Code Online (Sandbox Code Playgroud)
同
>>> labels
array([1, 2, 0, 0, 2])
Run Code Online (Sandbox Code Playgroud)
而这里是numpy广播的神奇之处.现在,它labels是一个形状的一维物体(5,).如果我们使它成为一个二维形状对象(5,1),那么操作将在最后一个轴上"广播",我们将得到一个形状(5,3)的输出,其结果是比较每个条目标签的每个元素的范围.
首先,我们可以添加一个"额外"轴来labels使用None(或np.newaxis),改变它的形状:
>>> labels[:,None]
array([[1],
[2],
[0],
[0],
[2]])
>>> labels[:,None].shape
(5, 1)
Run Code Online (Sandbox Code Playgroud)
然后我们可以进行比较(这是我们之前看到的安排的转置,但这并不重要).
>>> np.arange(3) == labels[:,None]
array([[False, True, False],
[False, False, True],
[ True, False, False],
[ True, False, False],
[False, False, True]], dtype=bool)
>>> (np.arange(3) == labels[:,None]).astype(np.float32)
array([[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.],
[ 1., 0., 0.],
[ 0., 0., 1.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
numpy中的广播非常强大,非常值得一读.