sten
sten

Reputation: 7476

numpy.resize() rearanging instead of resizing?

I'm trying to resize numpy array, but it seems that the resize works by first flattening the array, then getting first X*Y elem and putting them in the new shape. What I want to do instead is to cut the array at coord 3,3, not rearrange it. Similar thing happens when I try to upsize it say to 7,7 ... instead of "rearranging" I want to fill the new cols and rows with zeros and keep the data as it is. Is there a way to do that ?

> a = np.zeros((5,5))
> a.flat = range(25)
> a
array(
  [[  0.,   1.,   2.,   3.,   4.],
   [  5.,   6.,   7.,   8.,   9.],
   [ 10.,  11.,  12.,  13.,  14.],
   [ 15.,  16.,  17.,  18.,  19.],
   [ 20.,  21.,  22.,  23.,  24.]])

> a.resize((3,3),refcheck=False)
> a
array(
  [[ 0.,  1.,  2.],
   [ 3.,  4.,  5.],
   [ 6.,  7.,  8.]])

thank you ...

Upvotes: 2

Views: 316

Answers (2)

Daniel
Daniel

Reputation: 19547

I believe you want to use numpy's slicing syntax instead of resize. resize works by first raveling the array and working with a 1D view.

>>> a = np.arange(25).reshape(5,5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>> a[:3,:3]
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12]])

What you are doing here is taking a view of the numpy array. For example to update the original array by slicing:

>>> a[:3,:3] = 0
>>> a
array([[ 0,  0,  0,  3,  4],
       [ 0,  0,  0,  8,  9],
       [ 0,  0,  0, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

An excellent guide on numpy's slicing syntax can be found here.

Upsizing (or padding) only works by making a copy of the data. You start with an array of zeros and fill in appropriately

upsized = np.zeros([7, 7])
upsized[:5, :5] = a

Upvotes: 4

eickenberg
eickenberg

Reputation: 14377

Upsizing to 7x7 goes like this

upsized = np.zeros([7, 7]) 
upsized[:5, :5] = a

Upvotes: 4

Related Questions