ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> numpy-discussion
numpy-discussion
Re: [Numpy-discussion] A case for rank-0 arrays
by Travis Oliphant other posts by this author
Feb 23 2006 9:34PM messages near this date
Re: [Numpy-discussion] A case for rank-0 arrays | Re: [Numpy-discussion] A case for rank-0 arrays
Sasha wrote:

> The main criticism of supporting both scalars and rank-0 arrays is
> that it is "unpythonic" in the sense that it provides two almost
> equivalent ways to achieve the same result.  However, I am now
> convinced that this is the case where practicality beats purity.
>   
> 
I think most of us agree that both will be with us for the indefinite 
future.

> The situation with ndarrays is somewhat similar. A rank-N array is
> very similar to a function with N arguments, where each argument has a
> finite domain (i-th domain of a is range(a.shape[i])).  A rank-0 array
> is just a function with no arguments and as such it is quite different
> from a scalar.  
> 
I can buy this view.  Nicely done.

> Just as a function with no arguments cannot be
> replaced by a constant in the case when a value returned may change
> during the run of the program, rank-0 array cannot be replaced by an
> array scalar because it is mutable.  (See
> http://projects.scipy.org/scipy/numpy/wiki/ZeroRankArray for use
> cases).
> 
> Rather than trying to hide rank-0 arrays from the end-user and treat
> it as an implementation artifact, I believe numpy should emphasize the
> difference between rank-0 arrays and scalars and have clear rules on
> when to use what.
>   
> 
I agree.  The problem is what should the rules be.  Right now, there are 
no clear rules other than rank-0 arrays --- DONT.

You make a case that we should not be so hard on rank-0 arrays.

> PROPOSALS
> ==========
> 
> Here are three suggestions:
> 
> 1. Probably the most controversial question is what getitem should
> return. I believe that most of the confusion comes from the fact that
> the same syntax implements two different operations: indexing and
> projection (for the lack of better name).  Using the analogy between
> ndarrays and functions, indexing is just the application of the
> function to its arguments and projection is the function projection
> ((f, x) -> lambda (*args): f(x, *args)).
> 
> The problem is that the same syntax results in different operations
> depending on the rank of the array.
> 
> Let
>   
> 
> >>>x = ones((2,2))
> >>>y = ones(2)
> >>>        
> >>>
> 
> then x[1] is projection and type(x[1]) is ndarray, but y[1] is
> indexing and type(y[1]) is int32.  Similarly, y[1,...] is indexing,
> while x[1,...] is projection.
> 
> I propose to change numpy rules so that if ellipsis is present inside
> [], the operation is always projection and both y[1,...] and
> x[1,1,...] return zero-rank arrays.  Note that I have previously
> rejected Francesc's idea that x[...] and x[()] should have different
> meaning for zero-rank arrays.  I was wrong.
>   
> 
I think this is a good and clear rule.  And it seems like we may be 
"almost" there.
Anybody want to implement it?

> 2. Another source of ambiguity is the various "reduce" operations such
> as sum or max.  Using the previous example, type(x.sum(axis=0)) is
> ndarray, but type(y.sum(axis=0)) is int32.  I propose two changes:
> 
>    a. Make x.sum(axis)  return ndarray unless axis is None, making
> type(y.sum(axis=0)) is ndarray true in the example.
> 
>   
> 
Hmm... I'm not sure.  y.sum(axis=0) is the default spelling of sum(y).  
Thus, this would cause all old code to return a rank-0 array.

Most people who write sum(y) want a scalar, not a "function with 0 
arguments"

>    b. Allow axis to be a sequence of ints and make
> x.sum(axis=range(rank(x))) return rank-0 array according to the rule
> 2.a above.
>   
> 
So, this would sum over multiple axes?  I guess I'm not opposed to 
something like that, but I'm not really excited about it either.   Would 
that make sense for all methods that take the axis= argument?

>    c. Make x.sum() raise an error for rank-0 arrays and scalars, but
> allow x.sum(axis=()) to return x.  This will make numpy sum consistent
> with the built-in sum that does not work on scalars.
> 
>   
> 
I don't think I like this at all. 

This proposal has more far-reaching implications (and would require more 
code changes --- though the axis= arguments do have a converter function 
and so would not be as painful as one might imagine).

In short, I don't feel as enthused about portion 2 of your proposal.

> 3. This is a really small change currently
>   
> 
> >>>empty(())
> >>>        
> >>>
> array(0)
> 
> but
> 
>   
> 
> 
> I propose to make shape=() valid in ndarray constructor.
>   
> 
+1

I think we need more thinking about rank-0 arrays before doing something 
like proposal 2.  However, 1 and 3 seem simple enough to move forward 
with...


-Travis




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@[...].net
https://lists.sourceforge.net/lists/listinfo/numpy-discussion
Thread:
Sasha
Francesc Altet
Francesc Altet
Colin J. Williams
Travis Oliphant
Sasha
Francesc Altet
Sasha
Travis Oliphant
Sasha
Francesc Altet

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved