【问题标题】:Indexing numpy matrix索引numpy矩阵
【发布时间】:2018-09-25 14:07:52
【问题描述】:

假设我有一个初始化为零的(4,10) 数组,并且我有一个[2,7,0,3] 形式的输入数组。输入数组将修改 zeros 矩阵,如下所示:

[[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],问题是为什么它有效而不使用冒号?

谢谢!

【问题讨论】:

  • 在您的冒号示例中,您选择的是指定列的每一行,而当您提供​​特定行时,只有那些被修改

标签: python arrays python-3.x numpy matrix


【解决方案1】:

您只希望为每一行更新一列。因此,对于 advanced indexing,您必须明确提供这些行标识符:

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.]])

【讨论】:

  • 感谢您的回答。所以我想用范围来告诉python一次走一行,输入数组中的对应值([2,7,0,3])。我想你的例子现在对我来说很清楚了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多