I don't know why numpy pad works like this

Might help to start simple and build up.

a = np.random.randint(1,5,(2))
print(a.shape)
print(a)

(2,)
[1 1]

a_pad = np.pad(a,(1,1),mode='constant',constant_values=(0))
print(a_pad.shape)
print(a_pad)

(4,)
[0 1 1 0]

Above we padded with the constant 0 both before and after in the single dimension. Next, let’s do 2 dimensions…

a = np.random.randint(1,5,(2,2))
print(a.shape)
print(a)

(2, 2)

[[3 2]
[4 4]]

a_pad = np.pad(a,(1,1),mode='constant',constant_values=(0))
print(a_pad.shape)
print(a_pad)

(4, 4)

[[0 0 0 0]
[0 3 2 0]
[0 4 4 0]
[0 0 0 0]]

Again we padded with the constant 0 both before and after, but now in in all dimensions, which in this case is 2. Let’s try again with 3 dimensions…

a = np.random.randint(1,5,(2,2,2))
print(a.shape)
print(a)

(2, 2, 2)
[[[2 2]
[1 1]]

[[4 2]
[1 3]]]

a_pad = np.pad(a,(1,1),mode='constant',constant_values=(0,0))
print(a_pad.shape)
print(a_pad)

(4, 4, 4)

[[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]

[[0 0 0 0]
[0 2 2 0]
[0 1 1 0]
[0 0 0 0]]

[[0 0 0 0]
[0 4 2 0]
[0 1 3 0]
[0 0 0 0]]

[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]]

Once again, we padded with the constant 0 both before and after in all dimensions, which in this case is 3.

The pattern is the same for all multidimensional inputs because of the way the pad_width parameter is being specified. With only a single value for the before_i and a single value for the after_i, it will be applied uniformly across all dimensions. To control the multi-dimensions separately, you have to use a more complicated expression for pad_width. For example, what if we only wanted to pad one of the dimensions, and leave the rest unpadded?

a = np.random.randint(1,5,(2,2,2,2))
print(a)

[[[[1 4]
[3 3]]

[[3 3]
[3 4]]]

[[[1 3]
[4 1]]

[[4 1]
[1 3]]]]

a_pad = np.pad(a,((0,0),(0,0),(0,0),(1,1)),mode='constant',constant_values=(0))
print(a_pad)

[[[[0 1 4 0]
[0 3 3 0]]

[[0 3 3 0]
[0 3 4 0]]]

[[[0 1 3 0]
[0 4 1 0]]

[[0 4 1 0]
[0 1 3 0]]]]

https://numpy.org/doc/stable/reference/generated/numpy.pad.html

3 Likes