Hi Bryan and Luis, thanks for your quick response!  Both suggestions look 
great and I learned a few things about PDL like which, whereND, and 
dice_axis that I hadn't before.

Cheers,


--
Eric Wheeler

On Wed, 9 Aug 2023, Luis Mochan wrote:

> 
> You could use whereND, as:
>      pdl> p $target=sequence(5,10)
>      [
>        [ 0  1  2  3  4]
>        [ 5  6  7  8  9]
>        [10 11 12 13 14]
>        [15 16 17 18 19]
>        [20 21 22 23 24]
>        [25 26 27 28 29]
>        [30 31 32 33 34]
>        [35 36 37 38 39]
>        [40 41 42 43 44]
>        [45 46 47 48 49]
>      ]
> 
> Set a 1D mask
>      pdl> p $mask=random(10)>0.5
>      [1 0 0 1 1 0 1 1 1 0]
> Use mask to select elements. Notice the transpositions (here with mv)
> so that mask corresponds to rows, not to columns.
>      pdl> p $target->mv(0,1)->whereND($mask)->mv(1,0)
>      [
>        [ 0  1  2  3  4]
>        [15 16 17 18 19]
>        [20 21 22 23 24]
>        [30 31 32 33 34]
>        [35 36 37 38 39]
>        [40 41 42 43 44]
>      ]
> Operate on selected rows.
>      pdl> p $target->mv(0,1)->whereND($mask)->mv(1,0)**=2
>      [
>        [   0    1    4    9   16]
>        [ 225  256  289  324  361]
>        [ 400  441  484  529  576]
>        [ 900  961 1024 1089 1156]
>        [1225 1296 1369 1444 1521]
>        [1600 1681 1764 1849 1936]
>      ]
> Print the modified target
>      pdl> p $target
>      [
>        [   0    1    4    9   16]
>        [   5    6    7    8    9]
>        [  10   11   12   13   14]
>        [ 225  256  289  324  361]
>        [ 400  441  484  529  576]
>        [  25   26   27   28   29]
>        [ 900  961 1024 1089 1156]
>        [1225 1296 1369 1444 1521]
>        [1600 1681 1764 1849 1936]
>        [  45   46   47   48   49]
>      ]
> 
> Regards,
> Luis
> 
> 
> On Wed, Aug 09, 2023 at 12:10:09AM -0700, Eric Wheeler wrote:
> > Hello all!
> >
> > I would like to get a diced/sliced/indexed piddle that is derived from a
> > larger matrix based on rows indicated by a mask.
> >
> > For example, lets say I have a mask and I want to dice a matrix's rows
> > where the mask has a value of 1 (in any location):
> >
> >     pdl> p $mask = random(10)->transpose > 0.5
> >
> >     [
> >      [0]
> >      [0]
> >      [1]
> >      [0]
> >      [1]
> >      [1]
> >      [1]
> >      [0]
> >      [1]
> >      [0]
> >     ]
> >
> > and lets say that this is the origin matrix I want to dice:
> >
> >     pdl> p $target = sequence(5, 10)
> >
> >     [
> >      [ 0  1  2  3  4]
> >      [ 5  6  7  8  9]
> >      [10 11 12 13 14]
> >      [15 16 17 18 19]
> >      [20 21 22 23 24]
> >      [25 26 27 28 29]
> >      [30 31 32 33 34]
> >      [35 36 37 38 39]
> >      [40 41 42 43 44]
> >      [45 46 47 48 49]
> >     ]
> >
> > I would like to have a result that has only the rows where the mask is
> > marked with a 1, like this:
> >
> >     $result = filter_somehow_from($target by $mask);
> >     [
> >      [30 31 32 33 34]
> >      [35 36 37 38 39]
> >      [40 41 42 43 44]
> >      [45 46 47 48 49]
> >     ]
> >
> > so I can modify the result in-place, like square it:
> >
> >     $result **= 2;
> >
> >      [ 900  961 1024 1089 1156]
> >      [1225 1296 1369 1444 1521]
> >      [1600 1681 1764 1849 1936]
> >      [2025 2116 2209 2304 2401]
> >
> > so the `**= 2` will modify to the original matrix:
> >
> >     [
> >      [ 0  1  2  3  4]
> >      [ 5  6  7  8  9]
> >      [10 11 12 13 14]
> >      [15 16 17 18 19]
> >      [20 21 22 23 24]
> >      [25 26 27 28 29]
> >      [ 900  961 1024 1089 1156]
> >      [1225 1296 1369 1444 1521]
> >      [1600 1681 1764 1849 1936]
> >      [2025 2116 2209 2304 2401]
> >     ]
> >
> >
> > I know I could do something with ->slice to modify in-place, but ':,6:9' is 
> > not $mask:
> >
> >     pdl> p $target->slice(':,6:9') **= 2
> >
> >     [
> >      [ 900  961 1024 1089 1156]
> >      [1225 1296 1369 1444 1521]
> >      [1600 1681 1764 1849 1936]
> >      [2025 2116 2209 2304 2401]
> >     ]
> >
> >     pdl> p $target
> >
> >     [
> >      [   0    1    2    3    4]
> >      [   5    6    7    8    9]
> >      [  10   11   12   13   14]
> >      [  15   16   17   18   19]
> >      [  20   21   22   23   24]
> >      [  25   26   27   28   29]
> >      [ 900  961 1024 1089 1156]
> >      [1225 1296 1369 1444 1521]
> >      [1600 1681 1764 1849 1936]
> >      [2025 2116 2209 2304 2401]
> >     ]
> >
> > So $mask defines the rows I need to modify, and $mask could have 1's in
> > any location, and those are the locations I need to twiddle.
> >
> > Ideas?
> >
> > Thanks for your help!
> >
> > --
> > Eric Wheeler
> >
> >
> > _______________________________________________
> > pdl-general mailing list
> > pdl-general@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/pdl-general
> >
> 
> -- 
> 
>                                                                   o
> W. Luis Mochán,                      | tel:(52)(777)329-1734     /<(*)
> Instituto de Ciencias Físicas, UNAM  | fax:(52)(777)317-5388     `>/   /\
> Av. Universidad s/n CP 62210         |                           (*)/\/  \
> Cuernavaca, Morelos, México          | moc...@fis.unam.mx   /\_/\__/
> GPG: 791EB9EB, C949 3F81 6D9B 1191 9A16  C2DF 5F0A C52B 791E B9EB
> 
_______________________________________________
pdl-general mailing list
pdl-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdl-general

Reply via email to