[Numpy-discussion] storage order and concatenate
David Cournapeau
david at ar.media.kyoto-u.ac.jp
Fri Sep 29 03:36:54 EDT 2006
Travis Oliphant wrote:
> David Cournapeau wrote:
>
>> Hi,
>>
>>
>> What are the rules concerning storage with numpy ?
>>
> The rule is that a numpy array has "strides" which specify how many
> bytes to skip to get to the next element in the array. That's the
> internal model. There are no hard and fast rules about storage order.
> Internally, C-order is as good as Fortran-order (except the array
> iterator gives special preference to C-order and all functions for which
> the order can be specified (like zeros) default to C-order).
>
Ok, this is again a bad habit from matlab to think in C or F order...
> Thus, the storage order is whatever the strides say it is. Now, there
> are flags that keep track of whether or not the strides agree with the 2
> recognized special cases of "Fortran-order" (first-index varies the
> fastest) or "C-order" (last-index varies the fastest). But, this is
> only for convenience. Very few functions actually require a
> specification of storage order. Those that allow it default to "C-order".
>
> You can't think of a NumPy array has having a particular storage order
> unless you explicitly request it. One of the most common ways that
> Fortran-order arrays show up, for example is when a C-order array is
> transposed. A transpose operation does nothing except flip the strides
> (and therefore the flags) of the array. This is what is happening in
> concatenate (using axis=1) to give you a Fortran-order array.
> Bascially, code equivalent to the following is being run:
> concatenate([X1.T, X2.T]).T
>
> In the second example, you explicitly create the array (and therefore
> the strides) as C-order and then fill it (so it doesn't change on you).
> The first example used array calculations which don't guarantee the
> storage order.
>
> This is all seamless to the user until you have to interface with
> extension code. Ideally, you write compiled code that deals with
> strided arrays. If you can't, then you request an array of the required
> storage-order.
>
> By the way, for interfacing with ctypes, check out the
> ctypeslib.ndpointer class-creation function for flag checking and the
> require function for automatic conversion of an array to specific
> requirements.
>
>
I tried to to that at first, but I couldn't make the examples of numpy
works; after having tried at home with beta versions, it looks like it
is a ctype version problem, as it works with ctype 1.0 + numpy 1.0rc1.
Thanks for the explanations, this answers most questions I had in mind
for numpy internal layout compared to matlab which I am used to. I think
this should be in the wiki somewhere; do you mind if I use your email as
a basis for the tentative numpy tutorial (memory layout section, maybe) ?
David
More information about the NumPy-Discussion
mailing list