[SciPy-User] Numpy/Scipy: Avoiding nested loops to operate on matrix-valued images

tyldurd dhondt.olivier at gmail.com
Mon Mar 19 05:23:57 EDT 2012


Dan,

Thanks for your answer.

However, this solution does not work for me. 

First, it returns an array with dtype=object which is not the original type 
of the data.  Besides, the values in the array are not equal to the ones 
given by the 'traditional' nested loops. I think the problem comes from the 
fact that ufuncs are functions that act over each element of an array, not 
over slices.

I have done a lot of research on this topic but it seems it is not feasible 
in terms of slicing or vectorizing. The only solution I found would be with 
generalized ufuncs but from what I understand, they require to write C 
code, which I would like to avoid :-)

Therefore, I am going to stick to nested loops at least for now.

Regards,

Olivier

On Thursday, March 15, 2012 9:23:49 PM UTC+1, Dan Lussier wrote:
>
> Have you tried numpy.frompyfunc?
>
> http://docs.scipy.org/doc/numpy/reference/generated/numpy.frompyfunc.html
>
> http://stackoverflow.com/questions/6126233/can-i-create-a-python-numpy-ufunc-from-an-unbound-member-method
>
> With this approach you may be able create a function which acts 
> elementwise over your array to compute the matrix logarithm at each entry 
> using Numpy's ufuncs.  This would avoid the explicit iteration over the 
> array using the for loops.
>
> As a rough outline try:
>
> from scipy import linalg
> import numpy as np
>
> # Assume im is the container array containing a 3x3 matrix at each pixel.
>
> # Composite function so get matrix log of array A as a matrix in one step
> def log_matrix(A):
>     return linalg.logm(np.asmatrix(A))
>    
>
> # Creating function to operate over container array.  Takes one argument 
> and returns the result.
> log_ufunc = np.frompyfunc(log_matrix, 1, 1)
>
> # Using log_ufunc on container array, im
> res = log_ufunc(im)
>
> Dan
>    
>
> On 2012-03-15, at 1:59 AM, tyldurd wrote:
>
> Hello,
>
> I am a beginner at python and numpy and I need to compute the matrix 
> logarithm for each "pixel" (i.e. x,y position) of a matrix-valued image of 
> dimension MxNx3x3. 3x3 is the dimensions of the matrix at each pixel.
>
> The function I have written so far is the following:
>
> def logm_img(im):
>     from scipy import linalg
>     dimx = im.shape[0]
>     dimy = im.shape[1]
>     res = zeros_like(im)
>     for x in range(dimx):
>         for y in range(dimy):
>             res[x, y, :, :] = linalg.logm(asmatrix(im[x,y,:,:]))
>     return res
>
> Is it ok? Is there a way to avoid the two nested loops ?
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20120319/2dbd037b/attachment.html>


More information about the SciPy-User mailing list