[GRASS-dev] Compute mahalanobis distance using Scipy

Paulo van Breugel p.vanbreugel at gmail.com
Tue Feb 17 00:05:09 PST 2015


Brilliant, thanks!

On Tue, Feb 17, 2015 at 7:22 AM, Pietro <peter.zamb at gmail.com> wrote:

> On Mon, Feb 16, 2015 at 10:50 PM, Paulo van Breugel
> <p.vanbreugel at gmail.com> wrote:
> > On Sat, Feb 14, 2015 at 7:29 PM, Vaclav Petras <wenzeslaus at gmail.com>
> wrote:
> >> On Sat, Feb 14, 2015 at 11:47 AM, Paulo van Breugel
> >> <p.vanbreugel at gmail.com> wrote:
> >>> For a quick solution, what about using r.tile to split the input data
> in
> >>> tiles and compute the mahalanobis distance per tile.
> >>
> >> See PyGRASS GridModule class which will do tiling (and a lot of other
> >> things) for you.
> >>
> >>
> http://grass.osgeo.org/grass70/manuals/libpython/pygrass.modules.grid.html
> >
> > The Grid Module does indeed what I want, except that I want to run a
> python
> > function (the mahalanobis distance computation) on the tiles, while the
> > GridModule requires a raster GRASS r.* command. Any way around that?
> Writing
> > an intermediate addon/function that I can then call with the GridModule?
>
> mhh the GridModule it is heavily using the Module interface, therefore
> I think you should provide a module and then use the GridModule.
>
> Therefore I wrote a function that do exactly what you are looking for:
>
> {{{
> import numpy as np
>
> from grass.pygrass.gis.region import Region
> from grass.pygrass.raster import RasterRow
> from grass.pygrass.raster.buffer import Buffer
> from grass.pygrass.utils import split_in_chunk
>
>
> def mahalanobis_distance(array, param):
>     # compute mahalanobis distance, here just a dummy computation
>     dist = array / param
>     return dist
>
>
> def tiled_function(raster_input, raster_output, func,
>                    out_mtype='DCELL', overwrite=False, nrows=100,
>                    **kwargs):
>     reg = Region()
>     with RasterRow(raster_input, mode='r') as rinp:
>         with RasterRow(raster_output, mode='w', mtype=out_mtype) as rout:
>             buf = Buffer((reg.cols, ), mtype=out_mtype)  # take a row
> buffer
>             for chunk in split_in_chunk(rinp, nrows):
>                 ichunk = np.array(chunk)
>                 for row in func(ichunk, **kwargs):
>                     buf[:] = row[:]
>                     rout.put_row(buf)
>
>
> tiled_function('elevation', 'distance', mahalanobis_distance,
>                overwrite=True, param=2.)
> }}}
>
> I'm not sure where should I put this function, maybe in pygrass.raster
> or in pygrass.utils (but the last one it is a bit generic...).
>

pygrass.raster seems a logical place

>
> All the best
>
> Pietro
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20150217/84a737a8/attachment.html>


More information about the grass-dev mailing list