如何在 1 的任一侧用 1 填充长度为 n 的单热数组

How to pad a one hot array of length n with a 1 on either side of the 1

例如我有以下数组: [0, 0, 0, 1, 0, 0, 0] 我想要的是 [0, 0, 1, 1, 1, 0, 0]

如果 1 在末尾,例如 [1, 0, 0, 0] 它应该只在一侧添加 [1, 1, 0, 0]

如何在保持数组长度不变的情况下在两边加 1?我看过 numpy pad 函数,但这似乎不是正确的方法。

您可以使用 np.pad 创建数组的两个移位副本:一个向左移动 1 次(例如 0 1 0 -> 1 0 0),一个向左移动 1 次右边(例如 0 1 0 -> 0 0 1)。

然后您可以将所有三个数组加在一起:

  0 1 0
  1 0 0
+ 0 0 1
-------
  1 1 1

代码:

output = a + np.pad(a, (1,0))[:-1] + np.pad(a, (0,1))[1:]
# (1, 0) says to pad 1 time at the start of the array and 0 times at the end
# (0, 1) says to pad 0 times at the start of the array and 1 time at the end

输出:

# Original array
>>> a = np.array([1, 0, 0, 0, 1, 0, 0, 0])
>>> a
array([1, 0, 0, 0, 1, 0, 0, 0])

# New array
>>> output = a + np.pad(a, (1,0))[:-1] + np.pad(a, (0,1))[1:]
>>> output
array([1, 1, 0, 1, 1, 1, 0, 0])

使用 numpy.convolvemode == "same" 的一种方法:

np.convolve([0, 0, 0, 1, 0, 0, 0], [1,1,1], "same")

输出:

array([0, 0, 1, 1, 1, 0, 0])

加上其他例子:

np.convolve([1,0,0,0], [1,1,1], "same")
# array([1, 1, 0, 0])
np.convolve([0,0,0,1], [1,1,1], "same")
# array([0, 0, 1, 1])
np.convolve([1,0,0,0,1,0,0,0], [1,1,1], "same")
# array([1, 1, 0, 1, 1, 1, 0, 0])