索引数字矩阵



假设我有一个初始化为零的(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.]])

最新更新