[SciPy-user] Array Bounds

Perry Greenfield perry at stsci.edu
Fri Mar 9 22:59:55 EST 2007


On Mar 9, 2007, at 10:57 AM, Lorenzo Isella wrote:

> Dear All,
> Again a newbie question: I noticed that Python (or at least
> Numpy/Scipy) follows the C convention of labeling as zero the first
> element in an array.
> I can live with this, but I do not find very intuitive the loop  
> behavior:
>
> for i in range (1,5 )
>
> means that i actually takes values 1,2,3,4 and not 5!
> Why this choice? Is it a consequence of the array labeling? In case
> one should not like it, can it be changed by the user?
> Kind Regards
>
> Lorenzo

Your reaction is quite common for those coming from a language that  
uses 1-based indexing. But keep in mind there are also advantages for  
0-based indexing that you aren't aware of since you haven't used it.  
There are pros and cons to both (and yes, I've used both). Since  
Python uses 0-based, it generally isn't a good idea to adopt  
different conventions than the language uses for arrays. It may make  
your array usage more comfortable, but will lead to all sorts of  
problems when you use Python lists and tuples. (Note that you mention  
arrays, but your example is actually due to Python list behavior and  
the built-in range function, which has nothing to do with numpy; in  
principle array indexing behavior could be made different than Python  
list indexing behavior, but that would be a really bad thing to do).

Actually, your complaint is not directly due to that issue (though  
it's related). As I read it, it's because you are surprised that the  
end of the range does not include the number that's used for the end  
of the range. And that's a natural enough reaction. It's not  
intuitive to many people. But what's intuitive is not always the best  
choice. It works that way (I'm guessing here) because slices in  
Python work that way (e.g., mylist[1:5] doesn't include mylist[5]).  
Ok, why don't slices work that way? For various reasons, but one is  
that when you break a list into two pieces, e.g., mylist = mylist[:7]  
+ mylist[7:], you don't have to worry about dealing with those  
annoying +1 or -1 offsets to get things right. In this case, the  
number of items sliced is simply the difference of the two indices.  
It may seem like a small point, but a lot of errors arise from  
getting stuff like this wrong, especially the edge cases of when the  
slice point is at 0 or the end of an array. The rules Python has  
chosen for this stuff are consistent, and they do work pretty well.

So it isn't the most intuitive, especially to scientific or  
engineering types, but it's not that hard to get used to, and there  
are definite advantages to this approach.




More information about the SciPy-User mailing list