Python通过2d矩阵更新给定索引的子矩阵

时间:2016-10-28 17:32:12

标签: python numpy matrix

使用for循环实现简单。例如:

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> l.take(1)
res4: List[Int] = List(1)

scala> l take 1
res5: List[Int] = List(1)

scala> (l)take 1
res6: List[Int] = List(1)

scala> l.take(2)take(1)
res7: List[Int] = List(1)

我想做的是在没有for循环的情况下更新矩阵。像

这样的东西
s = np.zeros((3,3))
b = np.array(([0,1],[0,1],[2,0]))
for line in range(s.shape[0]):
    s[line][b[line]] = 1

但是s [b] .shape返回一个(3,2,3)矩阵。 有没有办法解决这个问题,或者我必须为每一行做一个for循环?

1 个答案:

答案 0 :(得分:0)

s[np.arange(s.shape[0])[..., None], b] = 1

我们在这里使用一些棘手的高级索引。 np.arange(s.shape[0])[..., None]生成列向量

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

针对b进行广播,为s的每一行选择由b行的元素给出的列索引。