loadmat#
- scipy.io.loadmat(file_name, mdict=None, appendmat=True, *, spmatrix=True, **kwargs)[source]#
加载 MATLAB 文件。
- 参数:
- file_namestr
MAT 文件名(如果 appendmat==True,则无需 .mat 扩展名)。也可以传入已打开的文件类对象。
- mdictdict, optional
用于插入 matfile 变量的字典。
- appendmatbool, optional
如果给定文件名中不存在 .mat 扩展名,则附加该扩展名。默认为 True。
- spmatrixbool, optional (默认: True)
如果为
True
,则返回稀疏coo_matrix
。否则返回coo_array
。仅与稀疏变量相关。- byte_orderstr or None, optional
默认为 None,表示字节顺序从 mat 文件中猜测。否则可以是 (‘native’, ‘=’, ‘little’, ‘<’, ‘BIG’, ‘>’) 中的一个。
- mat_dtypebool, optional
如果为 True,则以与加载到 MATLAB 中相同的 dtype 返回数组(而不是它们保存时的 dtype)。
- squeeze_mebool, optional
是否压缩单位矩阵维度。
- chars_as_stringsbool, optional
是否将字符数组转换为字符串数组。
- matlab_compatiblebool, optional
以 MATLAB 加载的方式返回矩阵(表示 squeeze_me=False, chars_as_strings=False, mat_dtype=True, struct_as_record=True)。
- struct_as_recordbool, optional
是否将 MATLAB 结构体加载为 NumPy 记录数组,或加载为带有 dtype=object 的旧式 NumPy 数组。将此标志设置为 False 会复制 scipy 0.7.x 版本的行为(返回 NumPy 对象数组)。默认设置为 True,因为它允许更方便地往返加载和保存 MATLAB 文件。
- verify_compressed_data_integritybool, optional
是否应检查 MATLAB 文件中压缩序列的长度,以确保它们不会超过预期。建议启用此功能(默认),因为 MATLAB 文件中过长的压缩序列通常表明文件已损坏。
- variable_namesNone or sequence
如果为 None(默认),则读取文件中的所有变量。否则,variable_names 应为字符串序列,给出要从文件中读取的 MATLAB 变量的名称。读取器将跳过名称不在此序列中的任何变量,这可能会节省一些读取处理时间。
- simplify_cellsFalse, optional
如果为 True,则返回简化的字典结构(如果 mat 文件包含单元格数组,则此功能很有用)。请注意,这仅影响结果的结构,而不影响其内容(两种输出结构的内容相同)。如果为 True,则会自动将 struct_as_record 设置为 False,并将 squeeze_me 设置为 True,这是简化单元格所必需的。
- uint16_codecstr, optional
用于解码以 uint16 值存储的字符的编解码器。默认使用系统编码,但可以手动设置为其他值,例如“ascii”、“latin1”和“utf-8”。此参数仅与存储为 v6 及以上版本的文件相关,与存储为 v4 的文件无关。
- 返回:
- mat_dictdict
字典,以变量名为键,加载的矩阵为值。
备注
支持 v4 (Level 1.0)、v6 和 v7 到 7.2 版本的 matfile。
您需要一个 HDF5 Python 库来读取 MATLAB 7.3 格式的 mat 文件。由于 SciPy 不提供此库,我们在此处不实现 HDF5 / 7.3 接口。
示例
>>> from os.path import dirname, join as pjoin >>> import scipy.io as sio
从 tests/data 目录获取示例 .mat 文件的文件名。
>>> data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data') >>> mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
加载 .mat 文件内容。
>>> mat_contents = sio.loadmat(mat_fname, spmatrix=False)
结果是一个字典,每个变量对应一个键/值对。
>>> sorted(mat_contents.keys()) ['__globals__', '__header__', '__version__', 'testdouble'] >>> mat_contents['testdouble'] array([[0. , 0.78539816, 1.57079633, 2.35619449, 3.14159265, 3.92699082, 4.71238898, 5.49778714, 6.28318531]])
默认情况下,SciPy 将 MATLAB 结构体读取为结构化 NumPy 数组,其中 dtype 字段的类型为 object,名称对应于 MATLAB 结构体字段名称。通过将可选参数 struct_as_record=False 设置为 False 可以禁用此功能。
获取包含名为 teststruct 的 MATLAB 结构体的示例 .mat 文件的文件名,并加载其内容。
>>> matstruct_fname = pjoin(data_dir, 'teststruct_7.4_GLNX86.mat') >>> matstruct_contents = sio.loadmat(matstruct_fname) >>> teststruct = matstruct_contents['teststruct'] >>> teststruct.dtype dtype([('stringfield', 'O'), ('doublefield', 'O'), ('complexfield', 'O')])
结构化数组的大小是 MATLAB 结构体的大小,而不是任何特定字段中的元素数量。除非可选参数 squeeze_me=True,否则形状默认为 2-D,在这种情况下会移除所有长度为 1 的维度。
>>> teststruct.size 1 >>> teststruct.shape (1, 1)
获取 MATLAB 结构体中第一个元素的“stringfield”。
>>> teststruct[0, 0]['stringfield'] array(['Rats live on no evil star.'], dtype='<U26')
获取“doublefield”的第一个元素。
>>> teststruct['doublefield'][0, 0] array([[ 1.41421356, 2.71828183, 3.14159265]])
加载 MATLAB 结构体,压缩掉长度为 1 的维度,然后从“complexfield”中获取项。
>>> matstruct_squeezed = sio.loadmat(matstruct_fname, squeeze_me=True) >>> matstruct_squeezed['teststruct'].shape () >>> matstruct_squeezed['teststruct']['complexfield'].shape () >>> matstruct_squeezed['teststruct']['complexfield'].item() array([ 1.41421356+1.41421356j, 2.71828183+2.71828183j, 3.14159265+3.14159265j])