我有一个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个索引的数组- zero_index =((origArray == 0).argmax(axis = 1)+ 1)#+1获得(index + 1)1s
使用列表推导创建输出 [[1] a + [0] (6-a for a in zero_index)
但是大约需要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]])