根据条件更新Numpy数组

时间:2019-04-19 10:29:59

标签: 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]])

我需要更新数组-

  1. 我将第一个0更新为1

  2. 我将前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]])

我能够通过两个步骤实现这一目标-

  1. 创建一个前0个索引的数组- zero_index =((ori​​gArray == 0).argmax(axis = 1)+ 1)#+1获得(index + 1)1s

  2. 使用列表推导创建输出 [[1] a + [0] (6-a for a in zero_index)

但是大约需要1百万行。

1 个答案:

答案 0 :(得分:1)

使用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,因为它以{{ 1}}。再用1, 0来解决这个问题!

cumsum

最后,使用c = c.cumsum(axis=1) 获得结果:

np.select

哪个给出所需的输出:

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