[Numpy-discussion] C vs. Fortran order -- misleading documentation?
Eric Firing
efiring at hawaii.edu
Tue Jun 8 14:36:07 EDT 2010
On 06/08/2010 08:16 AM, Eric Firing wrote:
> On 06/08/2010 05:50 AM, Charles R Harris wrote:
>>
>>
>> On Tue, Jun 8, 2010 at 9:39 AM, David Goldsmith<d.l.goldsmith at gmail.com
>> <mailto:d.l.goldsmith at gmail.com>> wrote:
>>
>> On Tue, Jun 8, 2010 at 8:27 AM, Pavel Bazant<MaxPlanck at seznam.cz
>> <mailto:MaxPlanck at seznam.cz>> wrote:
>>
>>
>> > > Correct me if I am wrong, but the paragraph
>> > >
>> > > Note to those used to IDL or Fortran memory order as it
>> relates to
>> > > indexing. Numpy uses C-order indexing. That means that the
>> last index
>> > > usually (see xxx for exceptions) represents the most
>> rapidly changing memory
>> > > location, unlike Fortran or IDL, where the first index
>> represents the most
>> > > rapidly changing location in memory. This difference
>> represents a great
>> > > potential for confusion.
>> > >
>> > > in
>> > >
>> > > http://docs.scipy.org/doc/numpy/user/basics.indexing.html
>> > >
>> > > is quite misleading, as C-order means that the last index
>> changes rapidly,
>> > > not the
>> > > memory location.
>> > >
>> > >
>> > Any index can change rapidly, depending on whether is in an
>> inner loop or
>> > not. The important distinction between C and Fortran order is
>> how indices
>> > translate to memory locations. The documentation seems
>> correct to me,
>> > although it might make more sense to say the last index
>> addresses a
>> > contiguous range of memory. Of course, with modern
>> processors, actual
>> > physical memory can be mapped all over the place.
>> >
>> > Chuck
>>
>> To me, saying that the last index represents the most rapidly
>> changing memory
>> location means that if I change the last index, the memory
>> location changes
>> a lot, which is not true for C-order. So for C-order, supposed
>> one scans the memory
>> linearly (the desired scenario), it is the last *index* that
>> changes most rapidly.
>>
>> The inverted picture looks like this: For C-order, changing the
>> first index
>> leads to the most rapid jump in *memory*.
>>
>> Still have the feeling the doc is very misleading at this
>> important issue.
>>
>> Pavel
>>
>>
>> The distinction between your two perspectives is that one is using
>> for-loop traversal of indices, the other is using pointer-increment
>> traversal of memory; from each of your perspectives, your
>> conclusions are "correct," but my inclination is that the
>> pointer-increment traversal of memory perspective is closer to the
>> "spirit" of the docstring, no?
>>
>>
>> I think the confusion is in "most rapidly changing memory location",
>> which is kind of ambiguous because a change in the indices is always a
>> change in memory location if one hasn't used index tricks and such. So
>> from a time perspective it means nothing, while from a memory
>> perspective the largest address changes come from the leftmost indices.
>
> Exactly. Rate of change with respect to what, or as you do what?
>
> I suggest something like the following wording, if you don't mind the
> verbosity as a means of conjuring up an image (although putting in
> diagrams would make it even clearer--undoubtedly there are already good
> illustrations somewhere on the web):
>
> ------------
>
> Note to those used to Matlab, IDL, or Fortran memory order as it relates
> to indexing. Numpy uses C-order indexing by default, although a numpy
> array can be designated as using Fortran order. [With C-order,
> sequential memory locations are accessed by incrementing the last
Maybe change "sequential" to "contiguous".
> index.] For a two-dimensional array, think if it as a table. With
> C-order indexing the table is stored as a series of rows, so that one is
> reading from left to right, incrementing the column (last) index, and
> jumping ahead in memory to the next row by incrementing the row (first)
> index. With Fortran order, the table is stored as a series of columns,
> so one reads memory sequentially from top to bottom, incrementing the
> first index, and jumps ahead in memory to the next column by
> incrementing the last index.
>
> One more difference to be aware of: numpy, like python and C, uses
> zero-based indexing; Matlab, [IDL???], and Fortran start from one.
>
> -----------------
>
> If you want to keep it short, the key wording is in the sentence in
> brackets, and you can chop out the table illustration.
>
> Eric
>
>
>>
>> Chuck
>>
>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
More information about the NumPy-Discussion
mailing list