Matlab (1,260)尺寸cell array转Python列表失败求助
解决Matlab Cell数组转Python列表的问题
我来帮你搞定这个转换问题~ 首先得明白:用scipy.io.loadmat加载Matlab的cell数组后,你得到的k其实是形状为(1,260)的numpy object类型数组,每个元素对应Matlab cell里的内容。直接用np.asarray(k, dtype='float')报错,大概率是因为cell里的元素不是直接的标量float,而是嵌套的numpy小数组(比如Matlab里的单个数值会被转成(1,1)的numpy数组),强制转float类型就会失败。
给你几个可行的解决步骤:
方法1:逐个处理元素(最稳妥)
先把二维的object数组展平成一维,再逐个判断元素类型并转换:
import scipy.io as sio import numpy as np # 加载数据 i = sio.loadmat('bispec.mat') k = i['a'] # 展平成一维数组(因为Matlab的(1,260)是行向量,Python里是二维的) k_flat = k.flatten() # 逐个转换为Python列表元素 val = [] for item in k_flat: # 如果元素是numpy数组,先转成Python标量;否则直接转float if isinstance(item, np.ndarray): # 单个数值的数组用.item()直接转成Python原生标量 val.append(item.item()) else: val.append(float(item))
方法2:用列表推导式简化代码
上面的循环可以写成更简洁的列表推导式:
val = [item.item() if isinstance(item, np.ndarray) else float(item) for item in k.flatten()]
方法3:加载时自动压缩单维度数组
加载Matlab文件时,加上squeeze_me=True参数,它会自动把所有单维度的数组(比如(1,1)的数值数组)压缩成标量,这样后续转换会更简单:
i = sio.loadmat('bispec.mat', squeeze_me=True) k = i['a'] # 此时k应该是一维的object数组,直接转列表即可 val = [float(item) for item in k]
排查错误小技巧
如果还是不确定哪里出问题,可以先打印几个元素的类型和内容看看:
print(type(k[0,0])) # 查看第一个元素的类型 print(k[0,0]) # 查看第一个元素的具体内容
这样就能知道cell里的元素到底是标量还是数组,针对性调整转换逻辑。
内容的提问来源于stack exchange,提问作者Khani
相关产品推荐
相关产品推荐

