Python读取mat文件后,如何将数据转为一维字符串列表?
嘿,这个问题我之前处理Matlab转Python数据时也碰到过!本质是Matlab和Numpy在数组结构、字符串存储上的差异搞的鬼,我来给你拆解下:
问题根源
你加载的变量b是一个二维Numpy数组(形状为(1, 15))——因为Matlab里的1行15列矩阵,在scipy加载后会被映射成二维数组。当你直接调用.tolist()时:
- 二维数组会被转换成嵌套列表,外层列表对应数组的行(这里只有1行,所以外层是一个只有1个元素的列表)
- 内层的每个元素是Numpy的单元素字符串数组(比如
array(['A'], dtype='<U13')),这是因为Matlab的字符串在scipy加载时会被包装成这种单元素数组结构
这就是你得到[[array(...), array(...), ...]]的原因。
解决办法
这里有几种简单的方式可以得到你想要的纯字符串列表:
方法1:展平数组 + 列表推导式提取字符串
先用ravel()把二维数组展平成一维,再遍历每个单元素数组提取里面的字符串:
import scipy.io as si a = si.loadmat('matfilename') b = a['variable'] # ravel()展平数组,elem是每个单元素字符串数组,取[0]拿到实际字符串 list1 = [elem[0] for elem in b.ravel()]
方法2:直接提取行 + 处理元素
因为你的数组只有1行,直接取第一行(b[0])得到一维数组,再逐个提取字符串:
list1 = [x[0] for x in b[0].tolist()]
方法3:转换为字符串数组后转列表
先把整个数组转换成字符串类型,再转列表后取第一行(因为原数组是1行):
list1 = b.astype(str).tolist()[0]
这三种方法都能输出你期望的['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']格式~
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

