# [SciPy-User] Simple ndarray dim question?

Travis Oliphant travis@continuum...
Fri May 11 15:02:10 CDT 2012

```On May 10, 2012, at 4:15 PM, Erik Kastman wrote:

> Hi all,
>
> Using SciPy and Matlab, I'm having trouble reconstructing an array to match what is given from a matlab cell array loaded using scipy.io.loadmat().
>
> For example, say I create a cell containing a pair of double arrays in matlab and then load it using scipy.io (I'm using SPM to do imaging analyses in conjunction with pynifti and the like)
>
> Matlab
>
>>> onsets{1} = [0 30 60 90]
>>> onsets{2} = [15 45 75 105]
>
> Python
>
>>>> import scipy.io as scio
>>>> mat = scio.loadmat('onsets.mat')
>>>> mat['onsets'][0]
>    array([[[ 0 30 60 90]], [[ 15  45  75 105]]], dtype=object)
>
>>>> mat['onsets'][0].shape
>
>    (2,)
>
> My question is this: **Why does this numpy array have the shape (2,) instead of (2,1,4)**? In real life I'm trying to use Python to parse a logfile and build these onsets cell arrays, so I'd like to be able to build them from scratch.

loadmat returns an array of *Python objects* because you have cell arrays.    Each object in the outer NumPy array is probably a (1,4) NumPy array of a different type.    To be sure look at

type(mat['onsets'][0][0])

and

mat['onsets'][0].shape

if the result of the first expression is an ndarray.

>
> When I try to build the same array from the printed output, I get a different shape back:
>
>>>> new_onsets = array([[[ 0, 30, 60, 90]], [[ 15,  45,  75, 105]]], dtype=object)
>    array([[[0, 30, 60, 90]],
>
>           [[15, 45, 75, 105]]], dtype=object)
>
>>>> new_onsets.shape
>    (2,1,4)

Now you have an "object" array of shape (2,1,4) where each object happens to be a Python int.   Normally you would make an array of "integers" or "floating point values".

You could build what you saw before with:

new_onsets = empty((2,), dtype=object)
new_onsets[0] = array([[0, 30, 60, 90]])
new_onsets[1] = array([[15, 45, 75, 105]])

-Travis

```

More information about the SciPy-User mailing list