这里提供了一个向量化的方法,灵感来自于
基于NumPy的前向填充。这个解决方案结合了"掩码"和"切片",用于实现前向填充部分。
def forward_fill_ifsame(x):
mask = x!=0
idx = np.where(mask,np.arange(len(x)),0)
np.maximum.accumulate(idx,axis=0, out=idx)
x1 = x.copy()
xm = x1[mask]
xm[:-1][xm[1:] != xm[:-1]] = 0
x1[mask] = xm
out = x1[idx]
out[mask] = x[mask]
return out
样例运行 -
In [289]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,3,1,0,1])
In [290]: np.vstack((x, forward_fill_ifsame(x)))
Out[290]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 3, 1, 0, 1],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 3, 3, 3, 3, 1, 1, 1]])
In [291]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,1,1,0,1])
In [292]: np.vstack((x, forward_fill_ifsame(x)))
Out[292]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 1],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 1, 1]])
In [293]: x = np.array([1,0,1,1,0,0,2,0,3,0,0,0,1,1,0,2])
In [294]: np.vstack((x, forward_fill_ifsame(x)))
Out[294]:
array([[1, 0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 2],
[1, 1, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 1, 1, 0, 2]])
[1, 0, 1..., 3, 0, 3, ..., 1,0,1]
? - kmario23