解释 numpy 中的代码是如何工作的

explain the code in numpy how its working

这是我 运行 :

的代码
labels=[0,1,1,0,2,1,1,1,0,0]
labels_ = np.zeros((10, 3))
labels_

上面的代码给出了输出:

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

现在当我 运行 下面的代码 "block 2"

labels_[np.arange(10), labels] = 1
labels_

它给出了输出:

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [0., 0., 1.],
       [0., 1., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [1., 0., 0.]])

谁能解释一下代码“块 2”中发生了什么?

当您使用方括号为 NumPy 数组编制索引时,括号中的第一个数字表示行,第二个数字表示列 - 就像战舰游戏一样。

现在,您正在使用名为 labels 的列表索引一个名为 labels_ 的零数组,以及一个由 np.arange:

创建的数组
labels_ = array([[0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

labels = [0,1,1,0,2,1,1,1,0,0]

np.arange(10) = array([0,1,2,3,4,5,6,7,8,9])

正如我们之前所说,NumPy 索引 [row,column] 而您正在使用索引 [np.arange(10), labels]。当您为 NumPy 提供多个索引值时,它会依次使用它们,因此它会查找 np.arange(10) 数组中的第一个值和 labels 列表中的第一项,并将它们用作行索引和列零数组的索引,labels_.

我们知道 np.arange(10) 中的第一项是 0,labels 中的第一项也是 0,因此它会在您的 labels_ 列表中查找 [0,0 ] - 第一行和第一列。你已经告诉它用你的 = 1 将索引设置为 1 所以它会这样做。

注意Python从0开始计数,所以第一行是第0行,第二行是第1行,第三行是第2行等等。还要注意我们把第一行算作顶部行,第一列为左列。

所以现在我们有:

labels_ = array([[1., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

接下来它查看 np.arange(10)labels 中的第二个值,我们知道 np.arange(10)[1] = 1labels[1] = 1 所以它设置第 1 行(第二行)和第 1 列(第二列)到 1.

所以现在我们有:

labels_ = array([[1., 0., 0.],
                 [0., 1., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

现在我们在np.arange(10)labels中寻找第三项,得到索引[2,1],也就是labels_数组的第三行第二列,我们设置为 `:

labels_ = array([[1., 0., 0.],
                 [0., 1., 0.],
                 [0., 1., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.],
                 [0., 0., 0.]]

我们一直这样做,直到 运行 超出我们用于索引的列表中的数字。