Hi,

If I read you correclty,
$rows=sumover sumover ($x*$mask->dummy(2,7))

works. Is it faster?
Ingo
On 08/10/2012 05:31 PM, Tim Haines wrote:
Hello, all.

I have a datacube of spatially-resolved spectra where each pixel in one of the NxM planes is one of the K flux values along the wavelength axis. I am trying to sum the spectra that lie on concentric annuli in the planes as determined by rvals. Here is what I have thus far.

use PDL;
my $x = sequence(double,5,6,7);
my $annuli = $x->slice(':,:,(0)')->sever->long->inplace->rvals;
my $mask = $annuli == $annuli->uniq->dummy(0)->dummy(0);

# Letting C =  $annuli->nelem, we thread the $mask cube planes
# over $x by inserting a single dimension at the third dim index
# of $mask.
#
# NxMxK * NxMx1xC -> (clump/sumover) -> KxC image
my $rows = ($x * $mask->dummy(2,1))->clump(2)->sumover;

Where $annuli is

[
 [3 3 3 3 3]
 [2 2 2 2 2]
 [2 1 1 1 2]
 [2 1 0 1 2]
 [2 1 1 1 2]
 [2 2 2 2 2]
]

and (for example) the mask for the third annulus ($mask->slice(':,:,(2)')) is

[
 [0 0 0 0 0]
 [1 1 1 1 1]
 [1 0 0 0 1]
 [1 0 0 0 1]
 [1 0 0 0 1]
 [1 1 1 1 1]
]

as expected.

The last line produces the desired result, but at great cost in memory footprint. Threading each plane in the $mask cube to select only the $x cube spectra lying along the current annulus creates a 4D hypercube. Given that some of my cubes have ~20 annuli and are ~20 MB in size, this gives me a memory footprint of ~400 MB for the intermediate hypercube. This is roughly a factor of 1000 greater than the size of the result in $rows.

Clearly, I need to find a way of looking up which spectra I want, rather than generating the whole result and then clumping to sum. I tried using whichND, but, while it gives me the correct set of indices for each annulus...

whichND($radii == $radii->uniq->dummy(0)->dummy(0))->xchg(0,1) =

[
 [2 1 2 3 1 3 1 2 3 0 1 2 3 4 0 4 0 4 0 4 0 1 2 3 4 0 1 2 3 4]
 [3 2 2 2 3 3 4 4 4 1 1 1 1 1 2 2 3 3 4 4 5 5 5 5 5 0 0 0 0 0]
[0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3] <-- want to thread over these
]

, I couldn't figure out how to make it group the indices by annulus number so that I can thread over them. I considered range, but it seems to be more for selecting contiguous regions. indexND looked plausible, but I couldn't figure out how to get it to thread over the Z dimension of my cube. If I could find a way of making whichND group the annuli, I would be able to use dice, but no such luck.

Any thoughts are greatly appreciated.

Thanks.

- Tim




_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl


_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to