[Numpy-discussion] in the NA discussion, what can we agree on?

T J tjhnson at gmail.com
Fri Nov 4 22:43:25 EDT 2011


On Fri, Nov 4, 2011 at 6:31 PM, Pauli Virtanen <pav at iki.fi> wrote:

> 05.11.2011 00:14, T J kirjoitti:
> [clip]
> >      a = 1
> >      a += 2
> >      a += IGNORE
> >      b = 1 + 2 + IGNORE
> >
> > I think having a == b is essential.  If they can be different, that will
> > only lead to confusion.  On this point alone, does anyone think it is
> > acceptable to have a != b?
>
> It seems to me that requiring this sort of a thing gives some
> limitations on how array operations should behave.
>
> An acid test for proposed rules: given two arrays `a` and `b`,
>
>         a = [1, 2, IGNORED(3), IGNORED(4)]
>        b = [10, IGNORED(20), 30, IGNORED(40)]
>
> (a) Are the following pieces of code equivalent:
>
>        print unmask(a + b)
>         a += 42
>        a += b
>         print unmask(a)
>
>     and
>
>        print unmask(b + a)
>         a += b
>        a += 42
>         print unmask(a)
>
> (b) Are the following two statements equivalent (wrt. ignored values):
>
>        a += b
>         a[:] = a + b
>
> For np.ma (a) is false whereas (b) is true. For arrays containing nans,
> on the other hand (a) and (b) are both true (but of course, in this case
> values cannot be unmasked).
>
> Is there a way to define operations so that (a) is true, while retaining
> the desired other properties of arrays with ignored values?
>
>
I thought that "PdC" satisfied (a) and (b).
Let me show you what I thought they were. Perhaps I am not being
consistent. If so, point out my mistake.

(A)  You are making two comparisons.

(A1)  Does  unmask(a+b) == unmask(b + a) ?

Yes.  They both equal:

   unmask([11, IGNORED(22), IGNORED(33), IGNORED(44)])
     =
   [11, 22, 33, 44]


(A2) Is 'a' the same after "a += 42; a += b" and  "a += b; a += 42"?

Yes.

>>> a = [1, 2, IGNORED(3), IGNORED(4)]
>>> b = [10, IGNORED(20), 30, IGNORED(40)]
>>> a += 42; a
[43, 44, IGNORED(45), IGNORED(46)]
>>> a += b; a
[53, IGNORED(64), IGNORED(75), IGNORED(86)]

vs

>>> a = [1, 2, IGNORED(3), IGNORED(4)]
>>> b = [10, IGNORED(20), 30, IGNORED(40)]
>>> a += b; a
[11, IGNORED(22), IGNORED(33), IGNORED(44)]
>>> a += 42; a
[53, IGNORED(64), IGNORED(75), IGNORED(86)]


For part (B), I thought we were in agreement that inplace assignment should
be defined so that:

 a += b

is equivalent to:

 tmp = a + b
 a = tmp

If so, this definitely holds.


Have I missed something?  Probably.  Please spell it out for me.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20111104/8b62f2fd/attachment.html>


More information about the NumPy-Discussion mailing list