Matlab vs Python: Reshape


Question

So I found this:

When converting MATLAB code it might be necessary to first reshape a matrix to a linear sequence, perform some indexing operations and then reshape back. As reshape (usually) produces views onto the same storage, it should be possible to do this fairly efficiently.

Note that the scan order used by reshape in Numpy defaults to the 'C' order, whereas MATLAB uses the Fortran order. If you are simply converting to a linear sequence and back this doesn't matter. But if you are converting reshapes from MATLAB code which relies on the scan order, then this MATLAB code:

z = reshape(x,3,4);

should become

z = x.reshape(3,4,order='F').copy()

in Numpy.

I have a multidimensional 16*2 array called mafs, when I do in MATLAB:

mafs2 = reshape(mafs,[4,4,2]) 

I get something different than when in python I do:

mafs2 = reshape(mafs,(4,4,2))

or even

mafs2 = mafs.reshape((4,4,2),order='F').copy()

Any help on this? Thank you all.

1
17
3/29/2014 8:02:57 PM

Accepted Answer

Example:

MATLAB:

>> mafs = [(1:16)' (17:32)']
mafs =
     1    17
     2    18
     3    19
     4    20
     5    21
     6    22
     7    23
     8    24
     9    25
    10    26
    11    27
    12    28
    13    29
    14    30
    15    31
    16    32

>> reshape(mafs,[4 4 2])
ans(:,:,1) =
     1     5     9    13
     2     6    10    14
     3     7    11    15
     4     8    12    16
ans(:,:,2) =
    17    21    25    29
    18    22    26    30
    19    23    27    31
    20    24    28    32

Python:

>>> import numpy as np
>>> mafs = np.c_[np.arange(1,17), np.arange(17,33)]
>>> mafs.shape
(16, 2)
>>> mafs[:,0]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])
>>> mafs[:,1]
array([17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32])

>>> r = np.reshape(mafs, (4,4,2), order="F")
>>> r.shape
(4, 4, 2)
>>> r[:,:,0]
array([[ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15],
       [ 4,  8, 12, 16]])
>>> r[:,:,1]
array([[17, 21, 25, 29],
       [18, 22, 26, 30],
       [19, 23, 27, 31],
       [20, 24, 28, 32]])
23
8/9/2012 10:54:32 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon