[Numpy-discussion] subsampling array without loops

Catherine Moroney Catherine.M.Moroney@jpl.nasa....
Fri Aug 22 12:38:48 CDT 2008

```I'm looking for a way to acccomplish the following task without lots
of loops involved, which are really slowing down my code.

I have a 128x512 array which I want to break down into 2x2 squares.
Then, for each 2x2 square I want to do some simple calculations
such as finding the maximum value, which I then store in a 64x256
array.

Here is the actual code involved.  It's only slightly more complex
than what I described above, since it also involves doing a bit of
masking on the 2x2 sub-arrays.

Any hints are much appreciated!  An inordinate amount of time is
being spent in this function and another one like it.

Catherine

def calc_sdcm_at_rlra(self,iblock):

npixl = self.nlineht/self.nlinerl
npixs = self.nsmpht/self.nsmprl

sdcm_out = numpy.array([Constants.CLOUDMASK_NR]
*self.nlinerl*self.nsmprl,'int8') \
.reshape(self.nlinerl,self.nsmprl)

for ilinerl in range(0,self.nlinerl):
for ismprl in range(0,self.nsmprl):

height = self.data[iblock].height[ilinerl*2:ilinerl*2
+2, ismprl*2:ismprl*2+2]
sdcm   = self.data[iblock].sdcm[ilinerl*2:ilinerl*2
+2, ismprl*2:ismprl*2+2]
source = self.data[iblock].heightsrc
[ilinerl*2:ilinerl*2+2, ismprl*2:ismprl*2+2]

mask1 = (source == Constants.HEIGHT_STEREO)
mask2 = ( (source == Constants.HEIGHT_SURFACE) | \
(source == Constants.HEIGHT_DEFAULT) )

if (mask1.any()):
loc = height[mask1].argmax()
sdcm_out[ilinerl,ismprl] = sdcm[mask1].ravel()[loc]
elif (mask2.any()):
loc = height[mask2].argmax()
sdcm_out[ilinerl,ismprl] = sdcm[mask2].ravel()[loc]

return sdcm_out

```

More information about the Numpy-discussion mailing list