tags:

views:

166

answers:

2

Hi all

I have some data represented in a 1300x1341 matrix. I would like to split this matrix in several pieces (e.g. 9) so that I can loop over and process them. The data needs to stay ordered in the sense that x[0,1] stays below (or above if you like) x[0,0] and besides x[1,1].
Just like if you had imaged the data, you could draw 2 vertical and 2 horizontal lines over the image to illustrate the 9 parts.

If I use numpys reshape (eg. matrix.reshape(9,260,745) or any other combination of 9,260,745) it doesn't yield the required structure since the above mentioned ordering is lost...

Did I misunderstand the reshape method or can it be done this way?

What other pythonic/numpy way is there to do this?

+1  A: 

Sounds like you need to use numpy.split() which has its documentation here ... or perhaps its sibling numpy.array_split() here. They are for splitting an array into equal subsections without re-arranging the numbers like reshape does,

I haven't tested this but something like:

numpy.array_split(numpy.zeros((1300,1341)), 9)

should do the trick.

JudoWill
This seems to do what I want. Thanks
BandGap
+1  A: 

reshape, to quote its docs,

Gives a new shape to an array without changing its data.

In other words, it does not move the array's data around at all -- it just affects the array's dimension. You, on the other hand, seem to require slicing; again quoting:

It is possible to slice and stride arrays to extract arrays of the same number of dimensions, but of different sizes than the original. The slicing and striding works exactly the same way it does for lists and tuples except that they can be applied to multiple dimensions as well.

So for example thearray[0:260, 0:745] is the "upper leftmost part, thearray[260:520, 0:745] the upper left-of-center part, and so forth. You could have references to the various parts in a list (or dict with appropriate keys) to process them separately.

Alex Martelli
Slicing is of course always an option but I had a feeling numpy might have something on board for this purpose...
BandGap