[Numpy-discussion] Downsampling a 2D array with min/max and nullvalues

Eric Firing efiring@hawaii....
Thu Jul 26 14:13:21 CDT 2007


Ludwig,

Masked arrays will do exactly what you want.  You have your choice of 
the numpy.ma version or the external maskedarray class.

Eric

Ludwig M Brinckmann wrote:
> Hi there,
> 
> I have a 2D array of size, lets say 40000 * 512, which I need to 
> downsample by a step of 4 in the y direction, and step 3 in the x 
> direction, so I would get an array of 10000 * 170 (or 171, the edges do 
> not matter much). But what I need to retain are the maxima and minima in 
> every 4*3 window.
> 
> I have a solution that works by first clipping off the edges of the 
> array, so that its shape is divisible by 4*3, and then applying a two 
> step process that will compute the min and max in strips --first in the 
> x direction and then in the y-direction through reshaping and reduce 
> (not super elegant, but it seems to work):
> 
> 
> def downsampleArray1D(data, step, nullValue):
>     print 'downsampling %d' %step
>     if data.shape[1] % step != 0:
>         xlen = data.shape[1] - data.shape[1] % step
>         data = data[...,:xlen]
>     data1d = data.ravel()
>     assert(data1d.shape[0] % step == 0)
>     data1d.shape = (len(data1d)/step, step)
>     maxdata = numpy.maximum.reduce(data1d,1)
>     mindata = numpy.minimum.reduce(data1d,1)
>     mindata.shape = ((data.shape[0],int(data.shape[1] / step)))
>     maxdata.shape = ((data.shape[0],int(data.shape[1] / step)))
>     return mindata, maxdata
>                     
> def downsampleArray2D(data, yStep, xStep, nullValue):
>     # first adjust the data to the step size by ignoring edges
>     if data.shape[0] % yStep != 0:
>         ylen = data.shape[0] - data.shape[0] % yStep
>         data = data[:ylen,...]
>     if data.shape[1] % xStep != 0:
>         xlen = data.shape[1] - data.shape[1] % xStep
>         data = data[...,:xlen]
>     minx, maxx = downsampleArray1D(data, xStep, nullValue)
>     minxt = numpy.transpose(minx)
>     minxt1, dummy = downsampleArray1D(minxt, yStep, nullValue)
> 
>     maxxt = numpy.transpose(maxx)
>     dummy, maxxt1 = downsampleArray1D(maxxt, yStep, nullValue)
> 
>     minimum = numpy.transpose(minxt1)
>     maximum = numpy.transpose(maxxt1)
> 
>     return minimum, maximum
> 
> 
> Now I need a solution that will ignore null values, i.e. that any value 
> that is equivalent to e.g. -999 ignored in the min and max computation, 
> but if all values in a 4*3 window are nullvalues, then min and max 
> should be set to the null value.
> 
> Any suggestions?
> 
> Ludwig
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion@scipy.org
> http://projects.scipy.org/mailman/listinfo/numpy-discussion



More information about the Numpy-discussion mailing list