[SciPy-User] Re[SciPy-user] binning to polar coordinates

Jerome Kieffer Jerome.Kieffer@esrf...
Tue Aug 28 08:01:07 CDT 2012


On Tue, 28 Aug 2012 03:33:11 -0700 (PDT)
arsbbr <arsbbr@gmx.net> wrote:

> 
> Hi,
> 
> I'm trying to rebin some uniform gridded data to polar coordinates. The
> original data (Z) is noisy but on a fine grid. 
> 
> ### snip
> 
> # define grid in cartesian coordinates
> x = arange(-500, 500)
> y = arange(-500, 500)
> X, Y = meshgrid(x, y)
> Z = X**2 + Y**2
> Z += uniform(-5000, 5000, size=Z.shape))
> 
> # transform to polar coordinates
> 
> def cart2pol(x, y):
>     theta = arctan2(y, x)
>     rho = sqrt(x**2 + y**2)
>     return (theta, rho)  
> 
> THETA_xy, RHO_xy = cart2pol(X, Y)
> 
> # define new polar grid
> theta = arange(-pi, pi, 0.1)
> rho = arange(0.1 ,500, 2.0)    
> 
> THETA, RHO = meshgrid(theta, rho)
> 
> # Tried to use griddata, but it gives of course very jumpy results, because
> it 
> # does not take the average over the pixels in a patch (dTHETA, dRHO) but an
> interpolation at the
> # exact new point.
> 
> interpolate.griddata((THETA_xy.ravel(), RHO_xy.ravel()), 
>    Z.ravel(), (THETA, RHO), method='linear')
>         
> ### snip
> 
> Is there a method that rebins the data to a new grid, possibly taking the
> average 
> of the Z-values inside a patch (dTHETA, dRHO)?

Try to use 2D-weighted histogram (divided by unweighted histograms). 
This unfortunately does dot split pixels over various bins so it works badly when the number of output bins is large.

w=histogram2d(THETA_xy.ravel(),RHO_xy.ravel(),(int(2*pi/0.1),500//2),weights=Z.ravel())
u=histogram2d(THETA_xy.ravel(),RHO_xy.ravel(),(int(2*pi/0.1),500//2))
imshow (w[0]/u[0])

If you want to split pixels, I am working on more sophisticated algorithm to do that in
https://github.com/kif/pyFAI  Tell me if you are interested.

Cheers,
-- 
Jérôme Kieffer
On-Line Data analysis / Software Group 
ISDD / ESRF
tel +33 476 882 445


More information about the SciPy-User mailing list