Shan
Shan

Reputation: 19243

Making a matrix square and padding it with desired value in numpy

In general we could have matrices of arbitrary sizes. For my application it is necessary to have square matrix. Also the dummy entries should have a specified value. I am wondering if there is anything built in numpy?

Or the easiest way of doing it

EDIT :

The matrix X is already there and it is not squared. We want to pad the value to make it square. Pad it with the dummy given value. All the original values will stay the same.

Thanks a lot

Upvotes: 9

Views: 18900

Answers (3)

yannis
yannis

Reputation: 916

Building upon the answer by LucasB here is a function which will pad an arbitrary matrix M with a given value val so that it becomes square:

def squarify(M,val):
    (a,b)=M.shape
    if a>b:
        padding=((0,0),(0,a-b))
    else:
        padding=((0,b-a),(0,0))
    return numpy.pad(M,padding,mode='constant',constant_values=val)

Upvotes: 11

LucasB
LucasB

Reputation: 3543

Since Numpy 1.7, there's the numpy.pad function. Here's an example:

>>> x = np.random.rand(2,3)
>>> np.pad(x, ((0,1), (0,0)), mode='constant', constant_values=42)
array([[  0.20687158,   0.21241617,   0.91913572],
       [  0.35815412,   0.08503839,   0.51852029],
       [ 42.        ,  42.        ,  42.        ]])

Upvotes: 5

rroowwllaanndd
rroowwllaanndd

Reputation: 3958

For a 2D numpy array m it’s straightforward to do this by creating a max(m.shape) x max(m.shape) array of ones p and multiplying this by the desired padding value, before setting the slice of p corresponding to m (i.e. p[0:m.shape[0], 0:m.shape[1]]) to be equal to m.

This leads to the following function, where the first line deals with the possibility that the input has only one dimension (i.e. is an array rather than a matrix):

import numpy as np

def pad_to_square(a, pad_value=0):
  m = a.reshape((a.shape[0], -1))
  padded = pad_value * np.ones(2 * [max(m.shape)], dtype=m.dtype)
  padded[0:m.shape[0], 0:m.shape[1]] = m
  return padded

So, for example:

>>> r1 = np.random.rand(3, 5)
>>> r1
array([[ 0.85950957,  0.92468279,  0.93643261,  0.82723889,  0.54501699],
       [ 0.05921614,  0.94946809,  0.26500925,  0.02287463,  0.04511802],
       [ 0.99647148,  0.6926722 ,  0.70148198,  0.39861487,  0.86772468]])
>>> pad_to_square(r1, 3)
array([[ 0.85950957,  0.92468279,  0.93643261,  0.82723889,  0.54501699],
       [ 0.05921614,  0.94946809,  0.26500925,  0.02287463,  0.04511802],
       [ 0.99647148,  0.6926722 ,  0.70148198,  0.39861487,  0.86772468],
       [ 3.        ,  3.        ,  3.        ,  3.        ,  3.        ],
       [ 3.        ,  3.        ,  3.        ,  3.        ,  3.        ]])

or

>>> r2=np.random.rand(4)
>>> r2
array([ 0.10307689,  0.83912888,  0.13105124,  0.09897586])
>>> pad_to_square(r2, 0)
array([[ 0.10307689,  0.        ,  0.        ,  0.        ],
       [ 0.83912888,  0.        ,  0.        ,  0.        ],
       [ 0.13105124,  0.        ,  0.        ,  0.        ],
       [ 0.09897586,  0.        ,  0.        ,  0.        ]])

etc.

Upvotes: 3

Related Questions