[Numpy-discussion] order flag again
oliphant at ee.byu.edu
Mon Mar 27 14:25:03 CST 2006
Zachary Pincus wrote:
>> The reason for the order flag is that it is needed to interpret what
>> you think a reshape operation should do. How should the reshape
>> method think the data is stored. That is the intended meaning of
>> the reshape flag.
>> The FORTRAN flag on the array means the strides are actually
>> equivalent to FORTRAN order
>> The CONTIGUOUS flag on the array means the strides are actually
>> equilvalent to C-CONTIGUOUS order.
>> To do what Tim suggests would require the addition of an additional
>> flag (call it the ORDER flag) on the array that would be carried
>> around to tell everybody how to think about this array as a one-
>> dimensional sequence of bytes.
>> Such an approach is possible, of course.
> Does this mean that if I create a new array with FORTRAN order from
> the numpy.array() function, every time I reshape that array I need to
> tell reshape to use FORTRAN order? That seems a bit odd...
Yes, that is what it means. Doing anything else leads to a host of
problems. Let me illustrate.
a = rand(10,3)
b = a.transpose()
b.flags # b is now in Fortran order
b.ravel() # do you really want this to now be interpreted in
FORTRAN-order. I didn't think so.
What this illustrates is that the FORTRAN and CONTIGUOUS flags on the
array are just special cases of the strides (and in fact can be updated
from the strides at any time). But, an ORDER flag would be an
independent concept that could be set and reset at will. The ORDER flag
is only necessary when somebody is interpreting the array as a linear
sequence of bytes.
If the ORDER flag is added, then the Array iterator would also need to
be updated, to recognize and respect the order flag. Right now, the
array iterator (a.flat) is always C-contiguous.
> Yet the text above seems to suggests that arrays will not know what
> order their own bytes are in, and thus would need to be told whether
> they should be reshaped like FORTRAN or C memory blocks.
> I assume I'm misinterpreting something here?
It wasn't until a few weeks ago that I think I really understood the
difference between ORDER='FORTRAN' and flags & FORTRAN == True.
The order information is really an additional but related piece of
The example above illustrates how you could have flags & FORTRAN == True
but order == 'C'
More information about the Numpy-discussion