从 Matlab 到 Python 的元胞数组字符串

问题描述

我有一个从 Matlab 获得的 .mat 数据集,其中包含一些数据,包括存储如下的 1920x1 元胞数组字符串:

"sample1"
"sample2"
"sample3"

我需要在 Python 中将它作为列表或数组导入。我已经使用 scipy 的 loadmat 获得了我的垫子,并且可以很好地导入其他类型的数据,但是我在尝试导入单元格字符串数组时遇到了问题:

import scipy.io as spio
import pandas as pd
import numpy as np

mat = spio.loadmat('Dati.mat',squeeze_me=True)
FD_Labels_cell = mat_char['FD_Labels']
list= np.asarray(FD_Labels_cell,dtype=object).tolist()
print(list)

输出

[[MatlabOpaque([(b'',b'MCOS',b'string',array([[3707764736],[         2],[         1],[         1]],dtype=uint32))],dtype=[('s0','O'),('s1',('s2',('arr','O')])],[MatlabOpaque([(b'',[         3],array([[3707764736]

然后输出继续。 我不知道为什么我会得到这种输出,而且我无法从我的 Matlab 文件获取单元格。

解决方法

那不是元胞数组,而是一个字符串。它是一种不同的数据类型。 Matlab 有 3 种不同的文本数据类型:

  1. 字符数组。看起来像 'this is a char'[a b';'c d']`。注意单引号和方括号)。由于历史原因,这有时在文档中被称为字符串。
  2. 单元格字符串,它实际上只是字符数组的单元格数组。看起来像 {'a b'}。注意单引号和大括号。这有几个名称,即字符串元胞数组、元胞字符串或 cellstr。
  3. 字符串数组。看起来像 "a b"["a b","c"]。注意双引号。这是与前两种完全不同的数据类型,而且也更新了很多,因此 scipy 显然不支持它。

如果您在保存之前在 MATLAB 中使用 cellstr 函数将其转换为元胞数组,您应该能够正确加载它。