代码之家  ›  专栏  ›  技术社区  ›  palazzo train

如何通过另一个数组中的索引更新ndarray中的值[duplicate]

  •  0
  • palazzo train  · 技术社区  · 6 年前

    例如,我有10x7个零数组 x=np.zeros( (10,7) )

    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., 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., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 0.]])
    

    我想在每一行中随机分配一个'1'。假设我创建了另一个数组(10,1),然后值在0-6之间。 r=np.random.randint(0, 7, (10,1))

    array([[6],
           [2],
           [5],
           [1],
           [2],
           [4],
           [6],
           [3],
           [0],
           [1]])
    

    我想从 r 这意味着将元素x[0,6],x[1,2],x[2,5],x[3,1]等设为0,那么x应该变成

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

    如何有效地做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mazdak    6 年前

    将一维数组用于 r 并将其用作列索引。对于行索引,您只需使用一个范围:

    In [25]: r=np.random.randint(0, 7, 10)
    
    In [26]: x=np.zeros( (10,7) )
    
    In [27]: x[np.arange(10), r] = 1
    
    In [28]: x
    Out[28]: 
    array([[0., 1., 0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0., 0., 1.],
           [0., 0., 0., 0., 0., 0., 1.],
           [0., 1., 0., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 0., 1., 0., 0., 0.],
           [0., 0., 0., 0., 1., 0., 0.],
           [0., 0., 1., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0., 0., 0.],
           [0., 1., 0., 0., 0., 0., 0.]])