[GRASS-user] Read/Write numpy array

Johannes Radinger JRadinger at gmx.at
Thu Apr 7 05:39:22 EDT 2011


Hello,

Am 06.04.2011 um 17:36 schrieb josef.pktd at gmail.com:

> On Wed, Apr 6, 2011 at 10:58 AM, Johannes Radinger <JRadinger at gmx.at> wrote:
>> Hello Glynn,
>> Hello Josef,
>> 
>> Thank you for your answer but I still get an error, although I changed the code
>> which is now:
>>    x = garray.array()
>>    x.read("distance_raster")
>>    Density = garray.array()
>>    Density[...] = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>    Density.write("Density")
>> 
>> the error says:
>>   Density[...] = p * stats.norm.pdf(x,loc=m, scale=s1*K) +
>> (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>  File "/Library/Frameworks/Python.framework/Versions/2.6/li
>> b/python2.6/site-packages/scipy/stats/distributions.py",
>> line 1104, in pdf
>>    x = arr((x-loc)*1.0/scale)
>> TypeError: unsupported operand type(s) for /:
>> 'numpy.ndarray' and 'numpy.ndarray'
>> 
>> 
>> Propably it has something to do with the stats-norm function of scipy which is working
>> with numpy array (maybe not with the garray)..or what does that error mean?
> 
> I guess is that one of your variables doesn't have a type that is
> numpy compatible (or defines division).
> My guess is that the exception shows up too late in the code, I would
> think there should be an asarray earlier in the
> scipy.stats.distributions code. (If it's not then that might be a
> bug.)
> 
> you could try np.asarray on all your variables and check which one has
> not have been converted yet
O thank you for that, I didn't realize that the variables K and s weren't converted
into a float, they were still a string... so stupid from me that I didn't check that
before, I was only thinking about the input array(x)...It is now working!

anyway just some questions about the handling of NULL values. Like in that example: 
>>    x = garray.array()
>>    x.read("distance_raster")
>>    Density = garray.array()
>>    Density[...] = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>    Density.write("Density")

The distance_raster contains a lot of NULL-values. It seems that they are somehow transformed
into a real value (I don't now to which one exactly) because after the Scipy-calculation (Density[...] =)
and the rewrite process I a value of 0.00101776158703459 in every cell which was a NULL-cell before.

Two questions:

1) is it possible to exclude NULL values from calculation (to speed up the process)
2) What do I've to set that NULL cells remain NULL cells also after the processing?


/johannes



> 
> stats.norm.pdf(np.asarray(x), loc=np.asarray(m), scale=np.asarray(s1*K))
> 
> I don't know what methods garray.array() inherits or has, so I don't
> know any specific answer.
> 
> Cheers,
> 
> Josef
> 
>> 
>> 
>> PS: @ You once helped me with this scipy equation I now want to use within a python-GRASS-GIS script.
>> Transforming a raster-map into an array and apply the scipy-function on it and transform it back to a raster.
>> Maybe you have some ideas what is the problem...
>> 
>> 
>> Am 05.04.2011 um 19:43 schrieb Glynn Clements:
>> 
>>> 
>>> Johannes Radinger wrote:
>>> 
>>>> I try to do a mapcalculation with scipy (do to limited functionality of
>>>> usual mapcalc functions.
>>>> 
>>>> Therefore I want to read a map into numpy-array, do the calculation
>>>> on it and write it back to a GRASS-map. I tried to follow the
>>>> instructions in the wiki
>>>> (http://grass.osgeo.org/wiki/GRASS_and_Python#Interfacing_with_NumPy)
>>>> but I got stucked when it comes to the writing-process.
>>>> Thats my code so far:
>>>> 
>>>>    x = garray.array()
>>>>    x.read("distance_raster")
>>>>    Density = garray.array()
>>>>    Density = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>>>    Density.write("Density")
>>>> 
>>>> The stats.norm.pdf is from the stats-scipy module. I get following
>>>> error when I try to process the script:
>>>> 
>>>>   Density.write("Density")
>>>> AttributeError: 'numpy.ndarray' object has no attribute
>>>> 'write'
>>>> 
>>>> I don't know excactly what how I have to use the write command.
>>> 
>>> The write() method is part of garray.array, which is a subclass of
>>> numpy.array (specifically, of numpy.memmap).
>>> 
>>> This line:
>>> 
>>>>    Density = garray.array()
>>> 
>>> creates an instance of garray.array and associates the name "Density"
>>> with it.
>>> 
>>> This line:
>>> 
>>>     Density = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>> 
>>> creates a normal numpy.array and associates the name "Density" with
>>> it, replacing the original association. Consequently, Density.write()
>>> fails because Density now refers to a numpy.array and not a
>>> garray.array().
>>> 
>>> Rather than making the name Density refer to the resulting
>>> numpy.array, you have to assign the resulting numpy.array *into* the
>>> existing garray.array to which the name Density already refers, i.e.:
>>> 
>>>     Density[...] = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>> 
>>> Note that the "..." (ellipsis) is literal. The above is equivalent to:
>>> 
>>>     Density[:,:] = p * stats.norm.pdf(x,loc=m, scale=s1*K) + (1-p) * stats.norm.pdf(x, loc=m, scale=s2*K)
>>> 
>>>> I am working on 6.5 and I read there were some problems with
>>>> numpy-arrays. Are the solved now?
>>> 
>>> I believe that the issue with grass.script.array requiring the 7.0
>>> version of r.{in,out}.bin has been solved by backporting the changes
>>> into 6.5.
>>> 
>>> --
>>> Glynn Clements <glynn at gclements.plus.com>
>>> _______________________________________________
>>> grass-user mailing list
>>> grass-user at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/grass-user
>> 
>> 



More information about the grass-user mailing list