That definitely seems like a bug to me. Thanks for the cross-check, Marek.
Devels, I see the same in the latest PDL release so it is not a
PDL-2.007 only issue.
--Chris
On 6/16/2015 09:36, Marek Gierliński wrote:
OK, thank you for your explanations. I'm not sure if all of this makes
sense. If you try
print $s > 5;
in the above example, you will get 'BAD'. 5 is just a scalar and not a
bad value. And $s is a one-dimensional piddle with a value different
from the bad value. Neither of the values in this conditional
expression is bad. Why does it return a string 'BAD'?
Marek
On Tue, 16 Jun 2015 at 14:24 Chris Marshall <devel.chm...@gmail.com
<mailto:devel.chm...@gmail.com>> wrote:
This result seems to violate the principle of least surprise.
On the LHS we have a PDL with badvalue(0) and on the RHS we
have a perl scalar with value 0 (which happens to be the bad
value for the PDL).
It seems surprising that $pdl > 0 is actually $pdl >
pdl(0)->badvalue(0)
Thoughts?
Chris
-------- Forwarded Message --------
Subject: Re: [Pdl-general] Weird behaviour of stats with bad values
Date: Tue, 16 Jun 2015 09:18:29 -0400
From: Chris Marshall <devel.chm...@gmail.com>
<mailto:devel.chm...@gmail.com>
To: Derek Lamb <de...@boulder.swri.edu>
<mailto:de...@boulder.swri.edu>, Marek Gierliński
<marek.gierlin...@gmail.com> <mailto:marek.gierlin...@gmail.com>
CC: pdl-gene...@lists.sourceforge.net
<mailto:pdl-gene...@lists.sourceforge.net>
I think the problem is that if $s is a badvalue piddle with the
badvalue=0
then $s>0 is $s>BAD which is BAD. If you use a value for badvalue
that is
not in the comparison, you should be good.
--Chris
On 6/16/2015 09:11, Derek Lamb wrote:
Thanks for the simple example. That helps a lot.
The actual problem is that piddles with the badflags set always
evaluate to BAD when element-wise logical operations are
performed on them.
"print $s<0" prints BAD instead of 0 or 1. "print $x>0" also
prints [BAD BAD BAD BAD].
$m and $s have their badflags set (as they should, since they
were made from partially-bad data). You can check if they can be
safely cleared, and clear them if so, with $s->check_badflag,
etc. Since $m and $s are 1-element piddles, you can also just
set them directly to their scalar values, for example
map{$_=$_->sclr} ($m,$s)=stats($x); #if you know they are only
going to be 1 element piddles
OR
map{$_=$_->((0))} ($m,$s)=stats($x); #if you just want the first
value
The fact that $m and $s are 1-element piddles is likely what is
causing your problem. My guess is that this behavior has changed
(perhaps intentionally, perhaps not) between your old version and
more recent versions, and if you were getting $m and $s as simple
perl scalars before you would not have seen this problem. I can
verify that stats() has returned 1-piddles and not perl scalars
at least as far back as PDL-2.4.11.
cheers,
Derek
On Jun 16, 2015, at 6:29 AM, Marek Gierliński
<marek.gierlin...@gmail.com <mailto:marek.gierlin...@gmail.com>>
wrote:
Oops, sorry, I missed a line when copying the text. Here is the
code again.
use PDL;
use PDL::NiceSlice;
my $x = pdl(1, 2, 3, 0);
$x->badflag(1);
$x->badvalue(0);
print "x = $x\n";
my ($m, $s) = stats($x);
print "m = $m, s = $s\n";
print "s greater than zero\n" if $s > 0;
print "s less than zero\n" if $s < 0;
print "s equals zero\n" if $s == 0;
On Tue, 16 Jun 2015 at 12:20 Chris Marshall
<devel.chm...@gmail.com <mailto:devel.chm...@gmail.com>> wrote:
Hi Marek-
Do you have a complete example showing the problem?
You don't show where $m and $s are being set below.
Thanks,
Chris
On 6/16/2015 07:04, Marek Gierliński wrote:
I have recently encountered a weird problem with stats (or
statsover) using bad values. The resulting numbers have a
strange property, they always return true in comparisons.
This code:
use PDL;
use PDL::NiceSlice;
my $x = pdl(1, 2, 3, 0);
$x->badflag(1); $x->badvalue(0);
print "m = $m, s = $s\n";
print "s greater than zero\n" if $s > 0;
print "s less than zero\n" if $s < 0;
print "s equals zero\n" if $s == 0;
returns the following output:
x = [1 2 3 BAD]
m = 2, s = 1
s greater than zero
s less than zero
s equals zero
which doesn't make any sense. Can anyone explain this? I
always assumed that 'stats' returned ordinary Perl scalars,
but this must be something different.
I'm using PDL version 2.007. We had an older version
installed for a long time and I think this problem appeared
when we upgraded to 2.007.
Marek
------------------------------------------------------------------------------
_______________________________________________
pdl-devel mailing list
pdl-devel@lists.sourceforge.net
<mailto: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