[Numpy-discussion] Ransom Proposals

Charles R Harris charlesr.harris at gmail.com
Mon Mar 27 15:47:05 EST 2006


On 3/27/06, Tim Hochberg <tim.hochberg at cox.net> wrote:
>
> Charles R Harris wrote:
>
> >
> >
> > On 3/27/06, *Tim Hochberg* <tim.hochberg at cox.net
> > <mailto:tim.hochberg at cox.net>> wrote:
> >
> >     Charles R Harris wrote:
> >     [CHOP]
> >
> >     >
> >     > How about functions always return a copy unless they are carefully
> >     > documented interface helper functions like asarray. That's how I
> >     > generally think of them anyway.
> >
> >     I don't really care as long as they (a) stop being evil and (b)
> >     there's
> >     some way to do stuff efficiently. Functions that always return
> copies
> >     seem sort of useless to me, but I'd be happy to move to methods if
> >     that
> >     was the case. However, I suspect you won't make much headway with
> this
> >     since my impression is that many of the people who do care about
> >     functions also care passionately about efficiency as well.
> >
> >     > Of course, the main virtue of asarray is that it helps write
> >     functions
> >     > that do precisely what Tim is arguing against: mixing list and
> array
> >     > types and returning copies in the first case, views in the
> >     second. So
> >     > if we throw out functions we should throw out asarray also and
> >     make a
> >     > rule that numpy functions don't take lists.
> >
> >     This isn't right. I think it's perfectly fine, desirable in fact,
> for
> >     functions to operate on both list and array types. The problem only
> >     arises when you return ether a view or copy of one of the original
> >     inputs depending on what it was. In my experience, this is
> relatively
> >     hard to do in all but the most trivial of functions since most
> >     operations return a new array. However, it is true that I think
> people
> >     should be strongly discouraged from doing this. For example:
> >
> >         def add(a, b):
> >             a = asarray(a)
> >             b = asarray(b)
> >             return a + b
> >
> >     is fine, but:
> >
> >         def iadd(a, b):
> >             a = asarray(a)
> >             b = asarray(b)
> >             a += b
> >             return a
> >
> >     is not and should be rewritten. Possibly like:
> >
> >         def iadd(a, b):
> >             if not isinstance(a, ndarray): raise TypeError("'a' must be
> an
> >         array")
> >             b = asarray(b)
> >             a += b
> >             return a
> >
> >     since += is a bit squirley. (Try somelist += somearray, to see
> >     what I mean).
> >
> >
> > It's a syntax error, which I believe is the right thing.




Really? If so, this is a version thing. This is what I get running on
> Python 2.4.1 and current numpy SVN (0.9.7.2286):
>
>      >>> l = list(a)
>      >>> l
>     [999, 1, 2, 3, 4, 5, 6, 7, 8]
>      >>> a
>     array([999,   1,   2,   3,   4,   5,   6,   7,   8])
>      >>> l += a
>      >>> l
>     array([1998,    2,    4,    6,    8,   10,   12,   14,   16])
>      >>> a
>     array([999,   1,   2,   3,   4,   5,   6,   7,   8])


Ugh. IMHO, this should throw an error. For these sort of assignment
operators I think the right hand side should be cast to the type of the
left, which I think of as some sort of fancy register variable. If anything,
the list should be appended to. I'll have to try the latest SVN just to
appreciate this.


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


More information about the NumPy-Discussion mailing list