scipy.io.loadmat错误地读取MATLAB(R2016a)结构

时间:2016-08-19 17:53:01

标签: python matlab

scipy.io.loadmat不是将MATLAB结构加载为dict(如http://docs.scipy.org/doc/scipy/reference/tutorial/io.html和其他相关问题中所述),而是将其作为奇怪的ndarray加载,其中值是数组的数组,并且字段名称被视为dtype。最小的例子:

(MATLAB):

>> a = struct('b',0)

a = 

    b: 0

>> save('simple_struct.mat','a')

(Python)的:

In[1]:
import scipy.io as sio
matfile = sio.loadmat('simple_struct.mat')
a = matfile['a']
a

Out[1]:
array([[([[0]],)]], 
      dtype=[('b', 'O')])

Python 2和3中仍存在此问题。

1 个答案:

答案 0 :(得分:0)

这是预期的行为。 Numpy只是向您展示MATLAB正在将您的数据存储在引擎盖下。

MATLAB结构是2 + D单元阵列,其中一个维度映射到字符串序列。在Numpy中,这个相同的数据结构称为“记录数组”,dtype用于存储名称。由于MATLAB矩阵必须至少为2D,因此存储在MATLAB中的0实际上是一个维度为(1, 1)的二维矩阵。

所以你在scipy.io.loadmat看到的是MATLAB如何存储你的数据(减去dtype位,MATLAB没有这样的东西)。具体来说,它是一个2D [1, 1]数组(这是Numpy调用的单元数组),其中一个维度映射到一个字符串,包含一个[1, 1] 2D数组。 MATLAB隐藏了一些这些细节,但numpy没有。