Without looking at your mistakes in detail, I can point out some pitfalls.
.MAT will contain MATLAB matrices (always 2d or higher), cells and structures.
loadmat displays them in various ways. There are dictionaries that you must index by name. There are object arrays (dtype = object). And there are numeric or string arrays. You may need to work through several levels to get a numerical array.
Check the "shape" (size) of the array and its "dtype". If the form is () and the dtype object, then extract it using y=x[()] .
Here is an example of such an array of 0d objects:
In [4]: y=np.arange(3) In [5]: x=np.empty((), dtype=object) In [6]: x[()]=y In [7]: x Out[7]: array(array([0, 1, 2]), dtype=object) In [8]: x.shape Out[8]: () In [9]: x.dtype Out[9]: dtype('O') In [10]: x[0] ... IndexError: too many indices for array In [11]: x[()] Out[11]: array([0, 1, 2])
x - is an array 0d (x.ndim), so it should be indexed via the tuple 0 elements () . For the MATLAB programmer, which may seem strange.
In numpy (in general, Python), x[a,b,c] matches x[(a,b,c)] and ind=(a,b,c); x[ind] ind=(a,b,c); x[ind] . In other words, the arguments in [] are understood as a set of values. (1,2) is a 2-element tuple, (1,) is one element ( (1) is just a grouping), and () is the root element. So x[()] is just an extension of the regular nd indexing notation. This is not a special case.