[Numpy-discussion] Help Understanding Indexing Behavior

Eelco Hoogendoorn hoogendoorn.eelco at gmail.com
Tue Feb 25 19:41:36 EST 2014

To elaborate on what Julian wrote: it is indeed simply a convention;
slices/ranges in python are from the start to one-past-the-end. The reason
for the emergence of this convention is that C code using iterators looks
most natural this way. This manifests in a simple for (i = 0; i < 5; i++),
but also when specifying a slice of a linked list, for instance. We don't
want to terminate the loop when we are just arriving at the last item; we
want to terminate a loop when we have gone past the last item. Also, the
length of a range is simply end-start under this convention; no breaking
your head over -1 or +1. Such little nudges of elegance pop up all over C
code; and that's where the convention comes from. Same as zero-based
indexing; just a convention, and if you are going to pick a convention you
might as well pick one that minimizes the number of required operations.
Anything but zero-based indexing will require additional integer math to
find an array element, given its base pointer.

On Wed, Feb 26, 2014 at 12:15 AM, Julian Taylor <
jtaylor.debian at googlemail.com> wrote:

> On 26.02.2014 00:04, JB wrote:
> > At the risk of igniting a flame war...can someone please help me
> understand
> > the indexing behavior of NumPy? I will readily I admit I come from a
> Matlab
> > background, but I appreciate the power of Python and am trying to learn
> more.
> >
> >>From a Matlab user's perspective, the behavior of indexing in NumPy seems
> > very bizarre. For example, if I define an array:
> >
> > x = np.array([1,2,3,4,5,6,7,8,9,10])
> >
> > If I want the first 5 elements, what do I do? Well, I say to myself,
> Python
> > is zero-based, whereas Matlab is one-based, so if I want the values 1 -
> 5,
> > then I want to index 0 - 4. So I type: x[0:4]
> >
> > And get in return: array([1, 2, 3, 4]). So I got the first value of my
> > array, but I did not get the 5th value of the array. So the "start" index
> > needs to be zero-based, but the "end" index needs to be one-based. Or to
> put
> > it another way, if I type x[4] and x[0:4], the 4 means different things
> > depending on which set of brackets you're looking at!
> >
> > It's hard for me to see this as anything by extremely confusing. Can
> someone
> > explain this more clearly. Feel free to post links if you'd like. I know
> > this has been discussed ad nauseam online; I just haven't found any of
> the
> > explanations satisfactory (or sufficiently clear, at any rate).
> >
> >
> numpy indexing is like conventional C indexing beginning from inclusive
> 0 to exclusive upper bound: [0, 5[. So the selection length is upper
> bound - lower bound.
> as a for loop:
> for (i = 0; i < 5; i++)
>  select(i);
> This is the same way Python treats slices.
> in comparison one based indexing is usually inclusive 1 to inclusive
> upper bound: [1, 4]. So the selection length is upper bound - lower
> bound + 1.
> for (i = 1; i <= 4; i++)
>  select(i);
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20140226/3a5e349e/attachment.html>

More information about the NumPy-Discussion mailing list