Hi Boyd,
thank you very much for your suggestions.
Using that idea we might obtain a simpler solution.

pdl> $r=zeroes(3,3)->ndcoords/2-pdl(0.5,0.5)

pdl> $rr=$r->magnover

pdl> $mask= $rr<0.4

pdl> $x= $r->slice("(0)")

pdl> $f = ($x+5) * $mask + $x*2 * (! $mask )

pdl> p $rr

[
 [       0.70710678               0.5        0.70710678]
 [              0.5                 0               0.5]
 [       0.70710678               0.5        0.70710678]
]


pdl> p $mask

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


pdl> p $x

[
 [-0.5    0  0.5]
 [-0.5    0  0.5]
 [-0.5    0  0.5]
]


pdl> p $f

[
 [-1  0  1]
 [-1  5  1]
 [-1  0  1]
]

Best regards



El mié, 22 ene 2025 a las 14:46, Boyd Duffee (<boyd.duf...@gmail.com>)
escribió:

> I'll throw some confusion into the mix with a different approach, which
> may not suit you. I would think of the conditional as applying a series of
> binary masks to your ndarray. Maybe something like
>
> $r = rvals(9,9)
> $mask = $r > 2
> $r2 = $r**2 * $mask + $r * (! $mask)
>
> where $mask is the binary value of the conditional you wanted the square
> and the (! $mask) is everywhere else. To build up multiple conditionals,
> you would create several masks, one for each conditional. You combine the
> masks by multiplying together for AND and adding together for OR.
>
> It's prettier, but does it work for you?  (maybe if you draw the problem
> and upload it as a gist on github or similar, we can see what else you
> could try)
>
> saludos,
> Boyd
>
> On Wed, 22 Jan 2025 at 16:24, Guillermo P. Ortiz <gor...@exa.unne.edu.ar>
> wrote:
>
>> Hello again,
>> I find some a not pretty solution using whereND
>>
>>
>> $r=(zeroes(3,3)->ndcoords/2-pdl(0.5,0.5))->r2C
>> $rr=($r**2)->sumover->sqrt
>> ($r1,$r2)=whereND($r->slice("(0)"),$r->slice("(1)"),$rr->abs<0.2)
>> ($r3,$r4)=whereND($r->slice("(0)"),$r->slice("(1)"),$rr->abs>=0.2)
>>
>> Then. modifying
>> $r1.= f($r1)
>> $r3.= f($r2,$r4)
>> ...
>>
>> Perform back dataflow to $r that I am looking for
>> Maybe a better solution is possible?
>>
>> Best regards
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> El mié, 22 ene 2025 a las 12:39, Guillermo P. Ortiz (<
>> gor...@exa.unne.edu.ar>) escribió:
>>
>>> Hello,
>>> the complex number in the case 1D can be obtained as expected
>>> doing first $r=$r->r2C
>>>
>>> But in 2D case I still did not have succeeded to match with
>>> dataflow on $r in the sense of the mask
>>>
>>> For example, If I do
>>>
>>> $r=(zeroes(3,3)->ndcoords/2-pdl(0.5,0.5))->r2C;
>>> $rr=($r**2)->sumover->sqrt;
>>> ($r1,$r2)=where_both($rr,$rr->abs<0.2)
>>>
>>> I obtain the expected result in $r1 and $r2 in agreement
>>> with the mask of the vectors lengths
>>>
>>> But, how to pass from that the respective length in the $r1
>>> and $r2 to the vectors in $r ? It would be some index indirection that
>>> manage these facts?
>>>
>>> Regards
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> El mar, 21 ene 2025 a las 20:35, Guillermo P. Ortiz (<
>>> gor...@exa.unne.edu.ar>) escribió:
>>>
>>>> Hi Ed,
>>>> yes, just I was trying with where_both
>>>> But I get unexpected behaviour for me in 2D case
>>>>
>>>> 1) first in 1D
>>>>
>>>> pdl> $r=zeroes(3)->ndcoords/2-pdl(0.5)
>>>>
>>>> pdl> p $r
>>>>
>>>> [
>>>>  [-0.5]
>>>>  [   0]
>>>>  [ 0.5]
>>>> ]
>>>>
>>>> pdl> ($r1,$r2)=where_both($r,$r->abs < 0.2)
>>>>
>>>> pdl> p $r1
>>>> [0]
>>>>
>>>> pdl> p $r2
>>>> [-0.5 0.5]
>>>>
>>>> now, trying to modify $r following that condition
>>>>
>>>> pdl> $r1.=$r1+1
>>>>
>>>> pdl> $r2.=$r2+3
>>>>
>>>> pdl> p $r
>>>>
>>>> [
>>>>  [2.5]
>>>>  [  1]
>>>>  [3.5]
>>>> ]
>>>>
>>>> But this seem did not work for complex number
>>>>
>>>> pdl> $r1.=$r1*(1+i)
>>>>
>>>> pdl> $r2.=$r2-(1+i)
>>>>
>>>>
>>>> pdl> p $r
>>>>
>>>> [
>>>>  [1.5]
>>>>
>>>>  [  1]
>>>>  [2.5]
>>>>
>>>> ]
>>>>
>>>> And, seem did not work in 2D for real case neither
>>>>
>>>> pdl> $r=zeroes(3,3)->ndcoords/2-pdl(0.5,0.5)
>>>>
>>>> pdl> p $r
>>>>
>>>> [
>>>>  [
>>>>   [-0.5 -0.5]
>>>>   [   0 -0.5]
>>>>   [ 0.5 -0.5]
>>>>  ]
>>>>  [
>>>>   [-0.5    0]
>>>>   [   0    0]
>>>>
>>>>  [ 0.5    0]
>>>>  ]
>>>>  [
>>>>   [-0.5  0.5]
>>>>
>>>>   [   0  0.5]
>>>>   [ 0.5  0.5]
>>>>
>>>> ]
>>>> ]
>>>>
>>>> pdl> ($r1,$r2)=where_both($r,($r**2)->sumover->sqrt < 0.2)
>>>>
>>>> pdl> p $r1
>>>> [0.5]
>>>>
>>>> pdl> p $r2
>>>> [-0.5 -0.5 0 -0.5 -0.5 -0.5 0 0]
>>>>
>>>> what I doing wrong here?
>>>>
>>>> Regards
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> El mar., 21 de enero de 2025 19:42, Ed . <ej...@hotmail.com> escribió:
>>>>
>>>>> Hi Guillermo,
>>>>>
>>>>> That does feel to me like you'd want to *not* do something on the
>>>>> whole ndarray, but instead do something on a $pdl->where(condition...).
>>>>> What do you think?
>>>>>
>>>>> Best regards,
>>>>> Ed
>>>>>
>>>>> ------------------------------
>>>>> *From:* Guillermo P. Ortiz <gor...@exa.unne.edu.ar>
>>>>> *Sent:* 21 January 2025 19:07
>>>>> *To:* Ed . <ej...@hotmail.com>
>>>>> *Cc:* pdl-devel@lists.sourceforge.net <pdl-devel@lists.sourceforge.net>;
>>>>> perldl <pdl-gene...@lists.sourceforge.net>
>>>>> *Subject:* Re: [Pdl-devel] conditional inline
>>>>>
>>>>> For instance, I am trying with $r, like below
>>>>>
>>>>> $r=(zeroes(2*$N+1,2*$N+1)->ndcoords-pdl($N,$N))/(2*$N+1)
>>>>>
>>>>> Regards
>>>>>
>>>>> El mar, 21 ene 2025 a las 14:39, Guillermo P. Ortiz (<
>>>>> gor...@exa.unne.edu.ar>) escribió:
>>>>>
>>>>> Yes Ed, you are right.
>>>>> I want to perform different operations on $r
>>>>> depending on its distance to a point $r0 in 2D.
>>>>> Then, I guess that first, and because for further
>>>>> manipulation, I decide to center $r-=$r0 in
>>>>> such a point.
>>>>>
>>>>> Then in false code,
>>>>>
>>>>> if ( length ($r)  < $a)
>>>>>  { return f($r)}
>>>>>  else
>>>>> { return g($r) }
>>>>>
>>>>> where "length" I am not sure, but it could be inner($r,$r)->sqrt.
>>>>> Maybe no ternary expression but some subroutine will be fine also.
>>>>>
>>>>> Regards
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> El mar, 21 ene 2025 a las 14:16, Ed . (<ej...@hotmail.com>) escribió:
>>>>>
>>>>> Hi Guillermo,
>>>>>
>>>>> That conditional will, for the case you've given, always be false,
>>>>> because it has values more than 0.2 away from 0.5. When you use all,
>>>>> you are asking a question about the entire ndarray, in other words for
>>>>> every single value in it.
>>>>>
>>>>> I believe that there's some real problem you're trying to solve, but
>>>>> I'm afraid I still have absolutely no idea what it is. Please help me help
>>>>> you!
>>>>>
>>>>> Best regards,
>>>>> Ed
>>>>>
>>>>> ------------------------------
>>>>> *From:* Guillermo P. Ortiz <gor...@exa.unne.edu.ar>
>>>>> *Sent:* 21 January 2025 01:19
>>>>> *To:* Ed . <ej...@hotmail.com>
>>>>> *Cc:* pdl-devel@lists.sourceforge.net <pdl-devel@lists.sourceforge.net>;
>>>>> perldl <pdl-gene...@lists.sourceforge.net>
>>>>> *Subject:* Re: [Pdl-devel] conditional inline
>>>>>
>>>>> Ok, Ed,
>>>>> That example did not work for me.
>>>>> The conditional results seems to be allways false. I mean, that it
>>>>> give $x also when $x is near to 0.5 than 0.2, where I is expecting the
>>>>> $x**2 result.
>>>>>
>>>>> Regates
>>>>>
>>>>>
>>>>>
>>>>> El El lun, 20 ene 2025 a la(s) 20:39, Ed . <ej...@hotmail.com>
>>>>> escribió:
>>>>>
>>>>> Hi Guillermo,
>>>>>
>>>>> You may still be having a problem, but you have yet to tell us what it
>>>>> is. The code you sent works fine, including as many dimensions as you like
>>>>> (because all acts on the whole ndarray at once).
>>>>>
>>>>> If there's a problem in there, please share it :-)
>>>>>
>>>>> Best regards,
>>>>> Ed
>>>>>
>>>>> ------------------------------
>>>>> *From:* Guillermo P. Ortiz <gor...@exa.unne.edu.ar>
>>>>> *Sent:* 20 January 2025 23:35
>>>>> *To:* Ed . <ej...@hotmail.com>
>>>>> *Cc:* pdl-devel@lists.sourceforge.net <pdl-devel@lists.sourceforge.net>;
>>>>> perldl <pdl-gene...@lists.sourceforge.net>
>>>>> *Subject:* Re: [Pdl-devel] conditional inline
>>>>>
>>>>> Thanks Ed,
>>>>> Using ternary conditional expression
>>>>> I still have some problem with múltiple disensión case.
>>>>> See my example in message befare
>>>>>
>>>>>
>>>>> El El lun, 20 ene 2025 a la(s) 19:31, Ed . <ej...@hotmail.com>
>>>>> escribió:
>>>>>
>>>>> Hi Guillermo,
>>>>>
>>>>> You can do that indeed, that's just Perl. If you wanted to do
>>>>> operations on a subset of that ndarray, then you'd do e.g.
>>>>>
>>>>> $pdl->where(($pdl-0.5)->abs < 0.2) *= 5;
>>>>>
>>>>> An observation is that the above condition could be a bit shorter by
>>>>> using the recently-added approx_artol: (which would also mean it ran
>>>>> quicker)
>>>>>
>>>>> $pdl->approx_artol(0.5, 0.2)
>>>>>
>>>>> Best regards,
>>>>> Ed
>>>>>
>>>>> ------------------------------
>>>>> *From:* Guillermo P. Ortiz <gor...@exa.unne.edu.ar>
>>>>> *Sent:* 20 January 2025 19:39
>>>>> *To:* pdl-devel@lists.sourceforge.net <pdl-devel@lists.sourceforge.net>;
>>>>> perldl <pdl-gene...@lists.sourceforge.net>
>>>>> *Subject:* [Pdl-devel] conditional inline
>>>>>
>>>>> Hello !
>>>>>
>>>>> I am not sure, but maybe It is possible to do with perl PDL something
>>>>> like this?
>>>>>
>>>>> $ndarray= condition on $ndarray ? assign when true : assign when false
>>>>>
>>>>> for example:
>>>>>
>>>>> $x=zeroes(20)->xlinvals(0,1);
>>>>>
>>>>> $y=(all abs($x-0.5)<0.2)?$x**2:$x;
>>>>>
>>>>> Thanks in advance
>>>>>
>>>>> Regards
>>>>>
>>>>> --
>>>>>
>>>>>
>>>>> Dr. Guillermo P. Ortiz
>>>>> Electromagnetismo Aplicado
>>>>> Dto. Física, Facultad de Ciencias Exactas
>>>>> Universidad Nacional del Nordeste
>>>>> Avda Libertad 5460
>>>>> <https://www.google.com/maps/search/Avda+Libertad+5460?entry=gmail&source=g>,
>>>>> Campus UNNE.
>>>>> W3404AAS Corrientes, Argentina.
>>>>> (+54) 379-4424678 interno 4613
>>>>> gortiz* at *unne edu ar
>>>>>
>>>>> _______________________________________________
>> pdl-devel mailing list
>> pdl-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/pdl-devel
>>
>
_______________________________________________
pdl-devel mailing list
pdl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdl-devel

Reply via email to