numpy array row major and column major
arrays, numpy, python
Solution
The numpy stores data in row major order.
>>> a = np.array([[1,2,3,4], [5,6,7,8]])
>>> a.shape
(2, 4)
>>> a.shape = 4,2
>>> a
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
If you change the shape, the order of data do not change.
If you add a 'F', you can get what you want.
>>> b
array([1, 2, 3, 4, 5, 6])
>>> c = b.reshape(2,3,order='F')
>>> c
array([[1, 3, 5],
[2, 4, 6]])
Problem
I'm having trouble understanding how `numpy` stores its data. Consider the following: ``` >>> import numpy as np >>> a = np.ndarray(shape=(2,3), order='F') >>> for i in xrange(6): a.itemset(i, i+1) ... >>> a array([[ 1., 2., 3.], [ 4., 5., 6.]]) >>> a.flags C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False ``` This says that `a` is column major (`F_CONTIGUOUS`) thus, internally, `a` should look like the following: ``` [1, 4, 2, 5, 3, 6] ``` This is just what it is stated in in this glossary. What is confusing me is that if I try to to access the data of `a` in a linear fashion instead I get: ``` >>> for i in xrange(6): print a.item(i) ... 1.0 2.0 3.0 4.0 5.0 6.0 ``` At this point I'm not sure what the `F_CONTIGUOUS` flag tells us since it does not honor the ordering. Apparently everything in python is row major and when we want to iterate in a linear fashion we can use the iterator `flat`. The question is the following: given that we have a list of numbers, say: `1, 2, 3, 4, 5, 6`, how can we create a `numpy` array of shape `(2, 3)` in column major order? That is how can I get a matrix that looks like this ``` array([[ 1., 3., 5.], [ 2., 4., 6.]]) ``` I would really like to be able to iterate linearly over the list and place them into the newly created `ndarray`. The reason for this is because I will be reading files of multidimensional arrays set in column major order.