Python 根据条件更新Numpy数组
我有一个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([[
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]])
我需要更新阵列,以便-
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]])
我可以通过两个步骤实现这一点-
但是,大约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工作得更快。谢谢!