The NumPy Fortran-ordering quiz

Travis Oliphant oliphant.travis at ieee.org
Tue Oct 17 23:35:07 CDT 2006


Stefan van der Walt wrote:
> One last case, which confuses me still (probably because it is
> 04:16am):
>
> In [41]: x = N.array([[0,1,2],[3,4,5]],order='F')
>
> In [42]: x
> Out[42]: 
> array([[0, 1, 2],
>        [3, 4, 5]])
>
> I assume the data is now stored in memory as
>
> [0 3 1 4 2 5] (column-wise)
>
> If I now do
>
> x.reshape((3,2),order='C')
>
> i.e. take that block of memory, assume it is in 'C' order, and make
> its shape (3,2), I expect
>
> [[0 3]
>  [1 4]
>  [2 5]]
>
> but get
>
> [[1 2]
>  [3 4]
>  [5 6]]
>
> I'm obviously missing something trivial -- I'll try again tomorrow.
>   

I think I see what is going on and where people are getting tripped up.  
  You have to remember, that to NumPy it doesn't semantically matter 
what the "ordering" of the array is.  There is no guarantee that C- 
order or Fortran-order is *ever* preserved through an operation.    
Because, in fact the general memory model of the array has no defined 
"order".  It's defined by the strides array.  It just so happens that 
two special-cases are tracked so that we can call out to compiled 
routines that expect contiguous arrays more easily.  

So, your mistake is trying to think that the "block" of memory is [0, 3, 
1, 4, 2, 5]  when you pass the Fortran-order array to the reshape 
method.    While this is true, and it means that you will save a copy if 
you passed this off to a Fortran routine, the reshape command does not 
use this information in determining how to "think-about" the input 
array.  In fact,  the reshape method does not allow any way to specify 
the order of the "input" array (self) separately from the order of the 
output array.   The order argument indicates the defined order of both 
input and output.  You might think that the order of self should be used 
as the order of  the input array.  The problem with this is, again, that 
a general array does not have a defined "order".  What should be used as 
the assumed "order" for an un-strided array?  You're left with an 
unresolved question.

To avoid two input order arguments, I just let order indicate the order 
for both the input and the output arrays.  We could provide both, but 
this seems a bit over-done as the same could be accomplished by 
separately raveling the input to 1-d and then specifying the order 
argument on reshape.

Please continue to question.  All the code needs as much review as it 
can get.

Best regards,


-Travis


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642




More information about the Numpy-discussion mailing list