Python 根据条件更新Numpy数组

Python 根据条件更新Numpy数组,python,numpy,Python,Numpy,我有一个numpy数组- 简短示例- array([[1, 0, 0, 1, 1, 1], [1, 0, 0, 1, 0, 0], [1, 1, 1, 1, 0, 0], [1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 0, 1]]) 我需要更新阵列,以便- 我将第一个0更新为1 我将第一个0之后的所有值更新为0 因此,对于上述数组,输出将如下所示- array([[

我有一个numpy数组- 简短示例-

array([[1, 0, 0, 1, 1, 1],
       [1, 0, 0, 1, 0, 0],
       [1, 1, 1, 1, 0, 0],
       [1, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 0, 1],
       [1, 0, 0, 1, 0, 1]])
我需要更新阵列,以便-

  • 我将第一个0更新为1

  • 我将第一个0之后的所有值更新为0

  • 因此,对于上述数组,输出将如下所示-

    array([[1, 1, 0, 0, 0, 0],
           [1, 1, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 0, 0]])
    
    我可以通过两个步骤实现这一点-

  • 创建第一个0索引的数组- 零#u索引=((origArray==0).argmax(axis=1)+1)#+1以获得(索引+1)1s

  • 使用列表理解创建输出 [1]a+[0](6-a)表示零指数中的a]


  • 但是,大约1Mil行需要花费大量时间。

    使用
    cumsum
    计算到目前为止,我们在每行中看到的零数:

    c = (x == 0).cumsum(axis=1)
    
    给你:

    array([[0, 1, 2, 2, 2, 2],
           [0, 1, 2, 2, 3, 4],
           [0, 0, 0, 0, 1, 2],
           [0, 1, 2, 3, 4, 4],
           [0, 0, 0, 0, 1, 1],
           [0, 1, 2, 2, 3, 3]])
    
    请注意,包含
    1
    的位置大多是我们需要设置为
    1
    的位置,但倒数第二行有两个
    1
    s,因为它以
    1,0
    结尾。用第二个
    cumsum
    解决这个问题

    c = c.cumsum(axis=1)
    
    最后,使用
    np。选择
    以获得结果:

    np.select([c == 1, c > 1], [1, 0], 1)
    
    这将提供所需的输出:

    array([[1, 1, 0, 0, 0, 0],
           [1, 1, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 0],
           [1, 1, 0, 0, 0, 0]])
    
    或者,更简单但不太灵活:

    (c <= 1).astype(int)
    

    (c工作得更快。谢谢!