[Numpy-discussion] subsampling array without loops
Zachary Pincus
zachary.pincus at yale.edu
Fri Aug 22 14:27:40 EDT 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.
Perhaps you could take the relevant slices of the arrays with
appropriate striding:
a = numpy.arange(128*512).reshape((128, 512))
top_left = a[::2, ::2]
top_right = a[::2, 1::2]
bottom_left = a[1::2, ::2]
bottom_right = a[1::2, 1::2]
tiles = numpy.array([top_left, top_right, bottom_left, bottom_right])
maxes = tiles.max(axis=0)
Similarly if you want overlapping tiles, you could leave out the
final :2 in the slice specifications above.
Zach
> 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
>
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion
More information about the NumPy-Discussion
mailing list