[Numpy-discussion] Bug fix or behavior change?

Charles R Harris charlesr.harris at gmail.com
Sat Sep 27 03:18:09 EDT 2008


On Sat, Sep 27, 2008 at 12:51 AM, Travis E. Oliphant <oliphant at enthought.com
> wrote:

> Charles R Harris wrote:
> > Hi All,
> >
> > Currently subtract for boolean arrays is defined in
> >
> > /**begin repeat
> >  * Arithmetic operators
> >  *
> >  * # OP = ||, ^, &&#
> >  * #kind = add, subtract, multiply#
> >  */
> > static void
> > BOOL_ at kind@(char **args, intp *dimensions, intp *steps, void *func)
> > {
> >     register intp i;
> >     intp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];
> >     char *i1=args[0], *i2=args[1], *op=args[2];
> >     for(i=0; i<n; i++, i1+=is1, i2+=is2, op+=os) {
> >         *((Bool *)op)=*((Bool *)i1) @OP@ *((Bool *)i2);
> >     }
> > }
> > /**end repeat**/
> >
> >
> > Note that this might yield unexpected results if the boolean value is
> > not 0 or 1, which is possible using views. Note also that bitwise_xor
> > converts the boolean to 0 or 1 before using ^. I think subtract should
> > work the same way, but that would change current behavior. So... do I
> > make the change and call it a bug fix or leave it as it is?
>
> I think it's a bugfix and so am +1 on the change.
>

Done. I've made all the boolean ufuncs convert args to  0 or 1 before
applying the operators. Next question, what about logical_and applied to
complex numbers. Currently it gives

In [16]: a = complex(1,0)

In [17]: b = complex(0,1)

In [18]: logical_and(a,b)
Out[18]: False

i.e., it && all the components together. I suspect what it should be doing
is anding first and second arguments being non-zero.

Also, there is this bit for absolute of signed numbers

static void
@TYPE at _absolute(char **args, intp *dimensions, intp *steps, void *func)
{
    UNARY_LOOP {
        const @type@ in1 = *((@type@ *)ip1);
        *((@type@ *)op) = (in1 < 0) ? -in1 : in1;
        *((@type@ *)op) += 0; /* clear sign-bit  */
    }
}

I don't understand the clearing the sign-bit line, it looks unnecessary. Was
there some problem that this once fixed?

Also, the signature for the ones_like ufuncs has 1 input argument, but only
the output argument is used. I suppose changing this would be a pain, but
it's a bit odd.

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20080927/97ea0eaf/attachment.html>


More information about the NumPy-Discussion mailing list