Zero pad ndarray along axis

Question:

I want to pad:

[[1, 2]
 [3, 4]]

to

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

I have no problem in doing so when input is 2D by vstack & hsrack

However, when I add 1 dim to represent the dim of number, such as:

img = np.random.randint(-10, 10, size=(2, 2, 2))

I cannot do so if I would not like to use for loop.
Is there any way to avoid for but only numpy’s stack to make it?

ps: for this example I should get (2,3,3) array by each 2 img instance is pad by zero at 1st column & 1st row.

Thanks

Asked By: chang jc

||

Answers:

You can use np.pad and remove the last row/column:

import numpy as np

a = np.array([[1, 2], [3, 4]])
result = np.pad(a, 1, mode='constant', constant_values=0)[:-1, :-1]
print(result)

Output:

[[0 0 0]
 [0 1 2]
 [0 3 4]]
Answered By: gmds

You can use np.pad, which allows you to specify the number of values padded to the edges of each axis.

So for the first example 2D array you could do:

a = np.array([[1, 2],[3, 4]])
np.pad(a,((1, 0), (1, 0)), mode = 'constant')

array([[0, 0, 0],
       [0, 1, 2],
       [0, 3, 4]])

So here each tuple is representing the side which to pad with zeros along each axis, i.e. ((before_1, after_1), … (before_N, after_N)).


And for a 3D array the same applies, but in this case we must specify that we only want to zero pad the two last dimensions:

img = np.random.randint(-10, 10, size=(2, 2, 2))
np.pad(img, ((0,0), (1,0), (1,0)), 'constant')

array([[[ 0,  0,  0],
        [ 0, -3, -2],
        [ 0,  9, -5]],

       [[ 0,  0,  0],
        [ 0,  1, -9],
        [ 0, -1, -3]]])
Answered By: yatu

If you want to pad only the column

import numpy as np

max_length =20
a = np.random.randint(1,size=(1, 10))
print(a.shape)
print(a.shape[1])
a =np.pad(a, [(0, 0), (0,  max_length - a.shape[1])], mode='constant')
print(a.shape)

Output

(1, 10)
10
(1, 20)
Answered By: Alex Punnen
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.