假设我有一个初始化为零的(4,10)
数组,并且我有一个[2,7,0,3]
形式的输入数组。输入数组将修改零矩阵,如下所示:
[[0,0,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,1,0,0],
[1,0,0,0,0,0,0,0,0,0],
[0,0,0,1,0,0,0,0,0,0]]
我知道我可以通过循环遍历输入目标并使用类似matrix[i][target in input target]
的东西索引矩阵数组来做到这一点,但我试图在没有循环的情况下做到这一点,如下所示:matrix[:, input_target] = 1
,但这让我将整个矩阵设置为所有 1。 显然,这样做的方法是:matrix[range(input_target.shape[0]), input_target]
,问题是为什么这有效而不使用冒号?
谢谢!
您只希望为每行更新一列。因此,对于高级索引,必须显式提供这些行标识符:
A = np.zeros((4, 10))
A[np.arange(A.shape[0]), [2, 7, 0, 3]] = 1
结果:
array([[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.]])
对行索引器使用冒号将告诉 NumPy 更新指定列的所有行:
A[:, [2, 7, 0, 3]] = 1
array([[ 1., 0., 1., 1., 0., 0., 0., 1., 0., 0.],
[ 1., 0., 1., 1., 0., 0., 0., 1., 0., 0.],
[ 1., 0., 1., 1., 0., 0., 0., 1., 0., 0.],
[ 1., 0., 1., 1., 0., 0., 0., 1., 0., 0.]])