This looks good to me.... can it be put in the next version?

Matt

On Mon, Aug 8, 2011 at 1:56 AM, chm <[email protected]> wrote:
> Here is a version that can handle multiple input
> piddles for the whereND condition mask:
>
>> sub whereND2 {
>>
>>   my $mask = pop @_;  # $mask has 0==false, 1==true
>>   my @to_return;
>>
>>   foreach my $arr (@_) {
>>
>>      # $arr  is M dimensional
>>      # $mask is N < M dimensional
>>      # dims($arr) 1..N == dims($mask) 1..N
>>      # thread over N+1 to M dimensions
>>
>>      my $n = sum($mask);
>>      my $sub_i = $mask * ones($arr);
>>      my $where_sub_i = where $arr, $sub_i;
>>
>>      # count the number of dims in $mask and $arr
>>      # $mask = a b c d e f.....
>>      my @idims = dims($arr);
>>
>>      # ...and pop off the number of dims in $mask
>>      foreach ( dims($mask) ) { shift(@idims) };
>>
>>      my $ndim = 0;
>>      foreach my $id ($n, @idims[0..($#idims-1)]) {
>>         $where_sub_i = $where_sub_i->splitdim($ndim++,$id);
>>      }
>>
>>      push @to_return, $where_sub_i;
>>   }
>>
>>   return (@to_return == 1) ? $to_return[0] : @to_return;
>> }
>
> One interesting test would be if code using where could
> replace that with calls to whereND and get the same
> results for cases where where works.
>
> --Chris
>
>
> On 8/7/2011 7:34 PM, chm wrote:
>>
>> I saw this thread and was thinking about where to
>> incorporate it into the PDL distribution but I
>> didn't like the use of whichND and indexND to
>> work around the fact that reshape is not a slicing
>> operation.
>>
>> I was able to implement a slice version of
>> reshape using the splitdim method which appears
>> to give the same results. The loop over the
>> additional pdls could be added to this version
>> as well...
>>
>>> sub whereND2 {
>>> use strict;
>>> my ($i, $w) = @_;
>>>
>>> # w is a mask 0 = false, 1 = true
>>> # i is M dimensional
>>> # w is N < M dimensional
>>> # dims(i) 1..N == dims(i) 1..N
>>> # thread over N+1 to M dimensions
>>>
>>> my $n = sum($w);
>>>
>>> my $sub_i = $w * ones($i);
>>>
>>> my $where_sub_i = $i->where($sub_i);
>>>
>>> # count the number of dims in w and i
>>> # w = a b c d e f.....
>>> my @idims = dims($i);
>>> # ...and pop off the number of dims in w
>>> foreach(dims($w)){shift(@idims)};
>>>
>>> $where_sub_i = $where_sub_i->splitdim(0,$n);
>>> my $ndim = 1;
>>> foreach my $id (@idims[0..($#idims-1)]) {
>>> $where_sub_i = $where_sub_i->splitdim($ndim++,$id);
>>> }
>>>
>>> return ($where_sub_i);
>>> }
>>
>> Maybe we could make reshape inplace-aware with the
>> inplace being the original version and the non-inplace
>> one based on slicing.
>>
>> --Chris
>>
>>
>> On 5/13/2010 1:46 AM, David Mertens wrote:
>>>
>>> If you want the syntax to be in line with where's syntax, you could
>>> pop $w
>>> off at the beginning and then apply the same routine to each element
>>> in @_.
>>> I've modified your function (untested) to give you an idea of what I
>>> mean:
>>>
>>> sub whereND {
>>> use strict; # ?
>>> # w is a mask 0 = false, 1 = true
>>> my $w = pop @_;
>>> my @to_return;
>>> foreach my $i (@_) {
>>> # i is M dimensional
>>> # w is N< M dimensional
>>> # dims(i) 1..N == dims(i) 1..N
>>> # thread over N+1 to M dimensions
>>>
>>> my $n = sum($w);
>>> my $mask = $w * ones($i);
>>>
>>> # count the number of dims in w and i
>>> # w = a b c d e f.....
>>> my @idims = dims($i);
>>> # ...and pop off the number of dims in w
>>> foreach(dims($w)){shift(@idims)};
>>>
>>> # calculate the indicies of $mask
>>> my $t = whichND($mask);
>>>
>>> # reshape $t so that it will look into $i correctly
>>> $t->reshape($mask->ndims, $n, @idims);
>>>
>>> push (@to_return, $i->indexND($t));
>>> }
>>>
>>> return @to_return;
>>> }
>>>
>>> David
>>
>> _______________________________________________
>> Perldl mailing list
>> [email protected]
>> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
>>
>>
>> -----
>> No virus found in this message.
>> Checked by AVG - www.avg.com
>> Version: 10.0.1391 / Virus Database: 1520/3818 - Release Date: 08/07/11
>>
>>
>
>



-- 
Matthew Kenworthy / Assistant Professor / Leiden Observatory
Niels Bohrweg 2 (#463) / P.O. Box 9513 / 2300 RA Leiden / NL

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

Reply via email to