Guido Muscioni
Guido Muscioni

Reputation: 1295

Numpy reshape - automatic filling or removal

I would like to find a reshape function that is able to transform my arrays of different dimensions in arrays of the same dimension. Let me explain it:

import numpy as np
a = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]]])
b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[1,2,3,3],[1,2,3,3]]])

I would like to be able to make b,c shapes equal to a shape. However, np.reshape throws an error because as explained here (Numpy resize or Numpy reshape) the function is explicitly made to handle the same dimensions.

I would like some version of that function that adds zeros at the start of the first dimension if the shape is smaller or remove the start if the shape is bigger. My example will look like this:

b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[0,0,0,0],[0,0,0,0]],[[1,2,3,3],[1,2,3,3]]])

Do I need to write my own function to do that?

Upvotes: 1

Views: 1441

Answers (2)

Dev Khadka
Dev Khadka

Reputation: 5461

This is similar to above solution but will also work also if lower dimensions don't match

def custom_reshape(a, b):
    result = np.zeros_like(a).ravel()
    result[-min(a.size, b.size):] = b.ravel()[-min(a.size, b.size):]
    return result.reshape(a.shape)

custom_reshape(a,b)

Upvotes: 1

Quang Hoang
Quang Hoang

Reputation: 150785

I would write a function like this:

def align(a,b):
    out = np.zeros_like(a)
    x = min(a.shape[0], b.shape[0])
    out[-x:] = b[-x:]

    return out

Output:

align(a,b)
# array([[[1, 2, 3, 3],
#         [1, 2, 3, 3]],

#        [[1, 2, 3, 3],
#         [1, 2, 3, 4]]])

align(a,c)
# array([[[0, 0, 0, 0],
#         [0, 0, 0, 0]],

#        [[1, 2, 3, 3],
#         [1, 2, 3, 3]]])

Upvotes: 1

Related Questions