pythonnumpyrow-major-ordercolumn-major-order

Python row major to column major order vector


Having a matrix like

ma = [[0.343, 0.351, 0.306], [0.145, 0.368, 0.487]]

I want to get a vector like:

[0.343, 0.145, 0.351, 0.368, 0.306, 0.487]

To try to get it, I am using numpy and reshape but it is not working.

a = np.array(ma)
>>> print a.shape
(2, 3)

But I am getting:

c = a.reshape(3, 2, order='F')
>>> print c
array([[ 0.343,  0.368],
       [ 0.145,  0.306],
       [ 0.351,  0.487]])

What would be the best way to do it for any matrix size? I mean, for example, if matrix is not squared like:

[[0.404, 0.571, 0.025],
 [0.076, 0.694, 0.230],
 [0.606, 0.333, 0.061],
 [0.595, 0.267, 0.138]]

I would like to get:

[0.404, 0.076, 0.606, 0.595, 0.571, 0.694, 0.333, 0.267, 0.025, 0.230, 0.061, 0.138]

Solution

  • You can use ravel() to flatten the array.

    >>> a.T.ravel()
    array([ 0.343,  0.145,  0.351,  0.368,  0.306,  0.487])
    
    # Or specify Fortran order.
    >>> a.ravel('F')
    array([ 0.343,  0.145,  0.351,  0.368,  0.306,  0.487])
    
    a = np.random.rand(4,2)
    >>> a
    array([[ 0.59507926,  0.25011282],
           [ 0.68171766,  0.41653172],
           [ 0.83888691,  0.22479481],
           [ 0.04540208,  0.23490886]])
    
    >>> a.T.ravel()  # or a.ravel('F')
    array([ 0.59507926,  0.68171766,  0.83888691,  0.04540208,  0.25011282,
            0.41653172,  0.22479481,  0.23490886])