python - 基于条件的数组零填充

标签 python numpy zero-padding

我有两个数组:

 a = numpy.array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
 label = numpy.array(['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'])

我正在寻找的是根据以下条件填充零:

If the label[i-1] != label[i]:
   pad several zeros (say, 3) to the 'a' array at the same 'i' location

所以,我想要的结果是:

a = numpy.array([ 1,  2,  3,  4,  5,  6,  7, 0, 0, 0, 8,  9, 10])
label = numpy.array(['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'])

如您所见,数组 a 现在在值 7 之后有 3 个零,这些零是根据标签值发生更改的条件进行填充的。

我尝试过以下代码:

for i in range(len(a)):
    if label[i-1] != label[i]:         
        a = numpy.pad(a, (0,3), 'constant')
    else:
       pass

但是,a 数组的末尾会填充零。正如我怀疑的那样,我应该将填充操作等同于同一个数组,因为它在 for 循环内发生变化。

最佳答案

这是一种基于 n​​umpy 的方法:

def pad_at_diff(x, y, n):   
    # boolean mask where diffs occur 
    m = np.r_[False, y[:-1]!= y[1:]]
    # output array, expanded taking into account 
    # zeros to add
    x_pad = np.zeros(len(x)+n*len(m[m]))
    # assign at according indices adding cumsum of m
    x_pad[np.arange(len(x))+np.cumsum(m)*n] = x
    return x_pad

a = np.array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
label = np.array(['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b'])
pad_at_diff(a, label, 3)
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  0.,  0.,  0.,  8.,  9., 10.])

或者对于另一个例子:

a = np.array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,11,12])
label = np.array(['a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'])
pad_at_diff(a, label, 3)
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  0.,  0.,  0.,  8.,  9., 10.,
        0.,  0.,  0., 11., 12.])

关于python - 基于条件的数组零填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62993770/

相关文章:

Python:如何用零填充?

python - 如何获取异常字典信息?

python - 带有枚举和 for 循环的代码在第一个字母上给我重复的结果

python - 在对 Spark 向量使用 .toArray() 之后,它应该是什么类型?

python - Pygame 运行游戏的速度非常慢

machine-learning - Keras嵌入层: keep zero-padded values as zeros

python - 在 Bokeh 图中添加可点击的圆圈

python - 如何在 python 中使用来自 bash 的数据流和子进程

python - 大型数据集 python (scipy) 的 interp1d 性能问题的线性插值

c - 在 printf 语句 C 的开头填充零