解释 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] = 1
和 labels[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.]]
我们一直这样做,直到 运行 超出我们用于索引的列表中的数字。
这是我 运行 :
的代码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] = 1
和 labels[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.]]
我们一直这样做,直到 运行 超出我们用于索引的列表中的数字。