I'm trying to create a Matlab cell array in python and save it as a .mat file, but am running into problems when all the cells contain 2 values:
import scipy.io as sio
twoValues = {'a': array([[array([[2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',twoValues)
In Matlab:
load('test.mat')
>>> a
a(:,:,1,1) =
2 3
a(:,:,1,2) =
2 3
>>> class(a)
ans =
int32
Back in python:
threeValues = {'a': array([[array([[2, 2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',threeValues)
In Matlab:
>>> a
a =
[3x1 int32] [2x1 int32]
>>> class(a)
ans =
cell
What's the reason for this?
解决方案
When you do this:
a = np.array([[np.array([[2, 2]]), np.array([[3, 3]])]])
the final call to np.array actually concatenates the inner two, so you get one array at the end:
>>> a
array([[[[2, 2]],
[[3, 3]]]])
>>> a.shape
(1, 2, 1, 2)
But to mimic a cell array you want to basically have an array of arrays. You can acheive this by setting dtype=object, but you must create the array and set the elements separately to avoid the automatic merging.
three = array([[array([[2, 2, 2]]), array([[3, 3]])]])
two = np.empty(three.shape, dtype=object)
two[0,0,0] = np.array([[2,2]])
two[0,1,0] = np.array([[3,3]])
Then:
sio.savemat('two.mat', {'two': two})
to see what they look like:
>>> two
array([[[array([[2, 2]])],
[array([[3, 3]])]]], dtype=object)
>>> two.shape
(1, 2, 1)
Note that I may have gotten confused about your desired shape, since you have so many nested brackets, so you might have to reshape some of this, but the idea should hold regardless.